Dependency injection 带Windows应用程序的Ninject

Dependency injection 带Windows应用程序的Ninject,dependency-injection,database-connection,desktop-application,ninject,architecture,Dependency Injection,Database Connection,Desktop Application,Ninject,Architecture,我想在我的Windows应用程序中使用Ninject,我想知道是否有我能做到的最佳实践;在性能和维护之间找到平衡的策略 Windows应用程序和Web应用程序的问题在于,在Web应用程序中,有一个易于定义的范围,即上下文,但在Windows应用程序中,没有一个范围可以在一个表单之后轻松使用 例如,我有一个查询数据库的服务。此服务具有构造函数并收到UnitOfWork。使用Ninject,我可以创建标记为要注入的属性,但如果这样做,每次创建此服务时,都会创建到数据库的新连接 正是出于这个原因,我必

我想在我的Windows应用程序中使用Ninject,我想知道是否有我能做到的最佳实践;在性能和维护之间找到平衡的策略

Windows应用程序和Web应用程序的问题在于,在Web应用程序中,有一个易于定义的范围,即上下文,但在Windows应用程序中,没有一个范围可以在一个表单之后轻松使用

例如,我有一个查询数据库的服务。此服务具有构造函数并收到UnitOfWork。使用Ninject,我可以创建标记为要注入的属性,但如果这样做,每次创建此服务时,都会创建到数据库的新连接

正是出于这个原因,我必须手动创建我的服务来控制创建的连接数量,并且不能使用依赖关系注入器


我发现,在为注入依赖项创建服务后,您可以调用注入方法,但我相信我可以使用更好的策略。

使用Ninject,您可以将注入依赖项的Ninject作用域生命周期设置为您想要提供的任何对象(不仅仅是单例、请求、线程和瞬态作用域)

从:

你也可以很容易地定义你自己 使用.InScope的作用域(对象o) 方法


你会发现一些关于对象作用域如何工作的实际细节。

表面上是关于NHibernate的,只提到过一次inject这个词(而且只提到wrt AOP),但是你的问题的措辞告诉我,当你考虑如何构建你的应用程序时,这将是一个很好的想法。

你也可以让你的框架依赖于一个工厂实例,并依赖于工厂来执行连接池。


或者,您可以使用Ninject本身来始终为特定类型使用相同的对象实例。

我终于找到了我要搜索的对象

创建从“Ninject.Activation.Provider(of T)”继承的类

覆盖函数“CreateInstance”

使用“Bind(属于[您的接口]).ToProvider([您的提供程序类])”绑定您的接口

现在,您将能够控制创建的与指定接口关联的每个实例

请注意,您可以将类型或实例传递给Bind方法的provider参数。您可以使用实例在绑定接口之前创建一个提供程序,并在希望创建新实例时在代码中使用该提供程序

提供程序与InScope结合使用,为您想要拥有的每个位置和对象的实例提供了极大的灵活性,可以自动注入对象并具有确定的范围

以下是一个例子:

Public Interface IConnection

End Interface

Public Class Connection
   Implements IConnection

End Class

Imports Ninject

Public Class StandardModule
   Inherits Ninject.Modules.NinjectModule

   Public Property ConnectionProvider As ConnectionProvider

   Public Overrides Sub Load()
      Bind(Of IConnection).ToProvider(Me.ConnectionProvider)
   End Sub
End Class

Public Class ConnectionProvider
   Inherits Ninject.Activation.Provider(Of IConnection)

   Public Property Connection As IConnection

   Protected Overrides Function CreateInstance(ByVal context As Ninject.Activation.IContext) As IConnection
      Return Me.Connection
   End Function
End Class

Imports Ninject

Module EntryPoint
   Sub Main()
      Dim provider As New ConnectionProvider
      Dim standardModule As New StandardModule
      Dim connection As IConnection
      Dim kernel As New Ninject.StandardKernel()

      standardModule.ConnectionProvider = provider

      kernel = New Ninject.StandardKernel(standardModule)

      ' Here you should use a factory instead of create an instance directly but
      ' for demonstration, it show how an instance can be propagated to object created
      ' by NInject.
      provider.Connection = New Connection

      connection = kernel.Get(Of IConnection)()
   End Sub
End Module

+1和相关链接是理解Ninject 2.0范围的必读内容。阅读链接文章后,我现在更好地了解了如何控制注入的依赖对象的生存期。这很好,但是如果没有一个好的架构,维护起来可能会很困难。似乎很少有人在web上提供有关如何设计一个好的windows应用程序以及如何在winform中启动对象范围的技巧,同时要记住许多其他表单可以一起工作。我使用Mindscape的LightSpeed和UnitOfWork使用缓存,当您有许多winforms一起工作时,数据必须经常共享。任何人都有一个具体的项目样本吗?@Samuel,老实说,我没有看到多少具体的样本应用程序,这些应用程序显示了整个架构良好的应用程序中使用ORM和UnitOfWork的Windows窗体。如果我能找到的话,我当然想亲自去看看。非常感谢你的回答。我将搜索一个样本项目与这些规格,我会把它发送到这里。很高兴听到你觉得你有一个答案。只要您有完整的lambda方法(在VB中直到版本X(2010?)都不完整,通常会使用Bind.ToMethod()-如果你有足够复杂的东西需要一个类,通常你应该把它作为一个容器无关的东西来做,作为你域逻辑的一部分。但是它肯定有一个位置,特别是如果你没有合适的lambda。