Dependency injection 依赖项注入:使用多项目解决方案时如何注入

Dependency injection 依赖项注入:使用多项目解决方案时如何注入,dependency-injection,ninject,Dependency Injection,Ninject,希望这个问题不要太愚蠢,我正试图掌握更高级的编程原理,因此试图习惯使用Ninject进行依赖注入 因此,我的模型被分为几个不同的.dll项目。一个项目定义了模型规范(接口),另外两个项目实现了这些接口。所有的模型项目都需要使用某种数据库系统,所以它们都需要访问另一个实现我所有数据库逻辑的.dll。但重要的是,它们都可以访问我的数据库对象的同一个实例,因此,仅为每个模型创建一个实例是不够的 不过,我不太确定如何使用依赖注入来实现这一点。我的第一个想法是创建一个单独的DI项目,并将所有接口绑定到各自

希望这个问题不要太愚蠢,我正试图掌握更高级的编程原理,因此试图习惯使用Ninject进行依赖注入

因此,我的模型被分为几个不同的.dll项目。一个项目定义了模型规范(接口),另外两个项目实现了这些接口。所有的模型项目都需要使用某种数据库系统,所以它们都需要访问另一个实现我所有数据库逻辑的.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
我很高兴能得到一些建议,目前我还没有主意;)
谢谢

客户端应用程序将使用Ninject注入实际的数据库和模型实现

因此,客户端应用程序需要引用数据库、idatabase、模型和imodel项目

idatabase和数据库项目需要引用模型项目,因为这些方法将返回模型对象或模型对象集合。看一看这张照片

您的模型不需要引用任何项目

模型需要访问DI项目,例如, 他们需要从DI系统请求数据库系统 (Ninject)

当您使用依赖项注入时,模型不需要访问DI框架,因为注入依赖项的是DI框架。模型对象不应该询问DI容器。当您的对象向容器请求依赖项时,它不是依赖项注入,而是服务定位器

我的第一个想法是创建一个单独的DI项目

当您只有一个应用程序(例如web应用程序)时,通常要做的是在启动项目中完全配置DI容器,尽可能靠近应用程序的入口点。组成所有对象图的入口点称为

所有模型项目都需要使用某种数据库系统,因此 所有人都需要访问另一个实现我所有数据库的.dll 逻辑


尝试制作POCO(普通的旧CLR对象)模型/实体对象,或者至少确保这些对象不需要引用任何其他项目,这将使您的体系结构(和测试)更加容易。

使用Ninject从一个模型中创建模式。

谢谢您的回答!所以我认为我的模型接收依赖项的唯一方法是通过构造函数注入,对吗?因为到目前为止,我一直在使用Ninject.kernel.Get有时(Ninject是内核的单例提供程序)在需要时为我的数据库创建新会话,所以有时在同一个方法中会使用几次。在这种特殊情况下,直接从数据库对象请求会话并不是问题,但在某些情况下,除了构造函数注入之外,您不需要其他DI方法吗?如果您使用的是POCOs(),则不需要向模型对象中注入任何内容。