我仍然在依赖注入方面积累了经验。我创建了一个新的控制台应用程序项目,并添加了两个其他项目来模仿真实世界的应用程序。所以我的应用程序中的三个项目是:
我创建了所有接口,以便MyBusinessService仅使用接口从存储库中获取数据。
我的问题是关于MyConsoleApp。据我了解,这是Ninject将解决所有依赖关系的地方。
两个问题:
我认为我的代码看起来像这样:
static void Main()
{
// Get Ninject going
var kernel = new StandardKernel();
// Bindings
kernel.bind<IMyDataRepository>().To<MyDataRepository>();
// Some business logic code my console app will process
}
答案 0 :(得分:0)
免责声明:我绝不是NInject专家(我参与过的项目倾向于使用StructureMap)。
回答问题1:
这取决于。如果您的应用程序代码直接依赖于数据存储库,则可以。但是,许多业务人员认为,使业务层包装数据访问层,并使主要应用程序代码仅取决于业务层是一种更好的做法(这样,您的应用程序就不需要持久性)。您的数据访问层将仅执行I / O,任何验证都将在业务层包装器中完成。
回答问题2:
我使用任何DI / IoC容器看到的任何代码都可以调用Bind()
或等效方法。如果您将IFoo
注入类,则IoC容器会“自动”解决依赖关系,容器将自动构造实现IFoo
的类的适当实例。但是为了使容器能够做到这一点,您必须指示容器使用哪个类。
请考虑以下情形:您有一个Web应用程序,偶尔连接的移动应用程序执行(主要是)相同的功能,即管理窗口小部件。该Web应用程序从Web服务获取其数据。该移动应用使用SQLite数据库。
您可能会有一个IWidgetRepository
界面来表示数据访问操作。但是您将有两种实现,一种实现与Web服务交互,另一种实现与SQLite DB交互。而且这两种实现方式(很可能)都将驻留在您的解决方案或共享包中。
在网络应用中,您需要将IWidgetRepository
绑定到网络服务实现;在移动应用中,您可以将其绑定到SQLite实现。由于所讨论的接口有多种实现方式-或更笼统地说,因为我们不能假设只有一种实现方式,因此需要指示容器使用哪种类/实现。
偶然地,大多数应用程序将此注册代码放置到一个单独的模块中,该模块通常称为“引导程序”(NInject实际上具有该名称的类),然后从启动代码中调用引导程序。