所以,我的模型被分成几个不同的.dll项目.一个项目定义了模型规范(Interfaces),其他一些项目实现了这些接口.所有模型项目都需要使用某种数据库系统,因此它们都需要访问另一个实现我所有数据库逻辑的.dll.但重要的是,所有这些都可以访问我的数据库对象的同一个实例,因此,如果仅为每个模型创建一个实例是不够的.
不过,我不太确定如何使用依赖注入来实现这一点.我的第一个想法是创建一个单独的DI项目并将所有接口绑定到它们各自的实现,因此DI项目需要引用所有其他项目(模型接口和实现,数据库系统等).然后,模型将需要访问DI项目,因为例如,他们需要从DI系统(Ninject)请求数据库系统.当然这会创建一个循环引用(将DI项目绑定到DI项目的模型和模型),所以这是不可能的.
简而言之,我需要一种编程模式,允许我将模型接口绑定到它们的实现,但这也允许模型实现从Ninject请求其他依赖项,例如:
IModel1 -> Model1 IModel2 -> Model2 (different project) IDatabase -> Database (different project) Model1 -> request IDatabase -> get Database instance Model2 -> request IDatabase -> get the same Database instance
很高兴得到一些建议,目前我被困住了,没有想法;)
谢谢!
the models would need access to the DI project since, for example,
they’d need to request the database system from the DI System
(Ninject)
当您使用依赖注入时,模型不需要访问DI框架,因为它是注入依赖项的DI框架.模型对象不应该询问DI容器.当您的对象向容器询问依赖关系时,它不会被称为依赖注入,而是服务定位器.服务定位器is considered an anti-pattern.
My first thought was to create a seperate DI-project
当您有一个应用程序(即Web应用程序)时,通常要做的是在最终应用程序中完全配置DI容器,尽可能接近应用程序的入口点.这被称为Composition Root.
All model projects need to use some sort of database system, so they
all need access to yet another .dll which implements all my database
logic
尝试制作POCO(普通旧CLR对象)模型/实体对象,或至少确保这些对象不需要引用任何其他项目,这使您的架构(和测试)更容易.