Ninject с приложением Windows - PullRequest
       62

Ninject с приложением Windows

6 голосов
/ 14 августа 2010

Я хочу использовать Ninject в своем приложении Windows, и я хочу знать, есть ли лучшие практики, которые я могу сделать; стратегии, чтобы найти баланс между производительностью и обслуживанием.

Проблема с приложением Windows и веб-приложением заключается в том, что в веб-приложении есть область, которую легко определить, это контекст, но с приложением Windows у вас нет области, которая бы легко использовалась формой после формы.

Например, у меня есть сервис, который запрашивает базу данных. Этот сервис имеет конструктор и получил UnitOfWork. С помощью Ninject я могу создать свойство, помеченное как внедряемое, но если я сделаю это, каждый раз, когда я буду создавать эту службу, будет создаваться новое соединение с базой данных.

Именно по этой причине я должен вручную создать свои службы, чтобы контролировать количество создаваемых соединений, и нельзя использовать инжектор зависимости.

Я обнаружил, что вы можете вызывать метод Inject после создания службы для зависимостей внедрения, но я уверен, что могу использовать более эффективную стратегию.

Ответы [ 4 ]

5 голосов
/ 15 августа 2010

С помощью Ninject вы можете иметь время жизни ваших внедренных зависимостей Ninject для любого объекта, который вы хотите предоставить (не только для областей Singleton, Request, Thread и Transient).Wiki :

Вы также можете легко определить свои собственные области, используя метод .InScope (object o).

Вы найдете некоторые реальные сведения о том, какопределение объекта работает в этом непростом вопросе и ответе групп Google .

3 голосов
/ 05 января 2011

Я наконец нашел то, что искал.

Создайте класс, который наследует от 'Ninject.Activation.Provider (of T)'

Переопределяет функцию 'CreateInstance'

Свяжите свой интерфейс с этим 'Bind (Of [Ваш интерфейс]). ToProvider ([Ваш класс провайдера])'

И теперь вы сможете контролировать каждый созданный экземпляр, связанный с указаннымinterface.

Обратите внимание, что вы можете передать тип или экземпляр параметру провайдера метода Bind.Вы можете с помощью экземпляра создать поставщика перед привязкой ваших интерфейсов и использовать этого поставщика в своем коде, когда хотите создать новый экземпляр.

Поставщик в сочетании с 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
2 голосов
/ 15 августа 2010

Эта статья Ayende в MSDN Magazine якобы о NHibernate, и упоминает слово «вводить» только один раз (и это только в АОП), но формулировка вашего вопроса подсказывает мне, что это будет здоровопища для размышлений, когда вы думаете, как создать свое приложение.

0 голосов
/ 15 декабря 2010

Вы также можете сделать свои фреймворки зависимыми от экземпляра фабрики и полагаться на фабрику для выполнения пула соединений.

Кроме того, вы можете использовать сам Ninject, чтобы всегда использовать один и тот же экземпляр объекта для определенного типа.

...