Мне нужно внедрить некоторую глобальную службу (daoFactory) в EventListenet, подписанную на событие PostUpdate. Я прочитал, что это можно сделать так:
public class YourPostInsertListener : IPostInsertEventListener
{
private readonly IPersistentAuditor auditor;
public YourPostInsertListener(IPersistentAuditor auditor)
{
this.auditor = auditor;
}
public void OnPostInsert(PostInsertEvent @event)
Но этот код просто генерирует исключение: для EventListener не был задан конструктор без параметров. И это понятное поведение, потому что я не добавил свои услуги в какой-либо контейнер. Итак, как я могу указать консинер IoC в NHibernate?
IoC, который я использовал, - это Ninject. Лучшим способом, который я нашел до сих пор, является использование ServiceLocator, предоставленного ребятами из Microsoft Patterns and Practices:
internal class YourPostInsertListener : IPostInsertEventListener
{
IKernel Kernel
{
get
{
return ServiceLocator.Current.GetInstance<IKernel>();
}
}
IPersistentAuditor
{
get
{
return Kernel.Get<IPersistentAuditor>();
}
}
// ... Rest of class
}
В классе, который устанавливает ваш контейнер IoC, вы сделаете следующее:
ServiceLocator.SetLocatorProvider( () => new NinjectServiceLocator( kernel ) );