2012-03-28 2 views
2

Я пытаюсь использовать Unity IoC с единицей работы & моделей хранилищ, однако я изо всех сил, чтобы решить, как мой репозиторий будет получить его Nhibernate сессии выполнять свою работу ...инъекционное IUnitOfWork в IRepository конструктор

Ниже у меня есть мой IUnityContainer, который выполняет мои привязки IoC. Затем у меня есть репозиторий NHibernate, который должен быть предоставлен ISession, который должен быть предоставлен из подразделения работы NHibernate, но я теперь уверен, как я могу сказать Unity чтобы предоставить его в его конструкторе ..

Я сделал привязку для IUnitOfWork к Nhib ... один, но как передать это значение в IRedository RegisterType?

private static IUnityContainer BuildUnityContainer() 
    { 
     var container = new UnityContainer(); 
     NHibernateHelper helper = new NHibernateHelper(); 

     // register all your components with the container here 
     // e.g. container.RegisterType<ITestService, TestService>();    

     container.RegisterControllers(); 
     container.RegisterType<IUnitOfWork, NHibernateUnitOfWork>(new HierarchicalLifetimeManager()); 
     container.RegisterInstance<ISessionFactory>(helper.SessionFactory); 
     container.RegisterType<IRepository, NHibernateRepository>() ; 

     return container; 
    } 



public class NHibernateRepository : IRepository 
{ 

public NHibernateRepository(ISession session) 
     { 
      _session = session; 
     } 
} 


    public class NHibernateUnitOfWork : IUnitOfWork 
    { 
     private readonly ISessionFactory _sessionFactory; 
     private readonly ITransaction _transaction; 
     public ISession Session { get; private set; } 

     public NHibernateUnitOfWork(ISessionFactory sessionFactory) 
     { 
      _sessionFactory = sessionFactory; 
      Session = _sessionFactory.OpenSession(); 
      Session.FlushMode = FlushMode.Auto; 
      _transaction = Session.BeginTransaction(IsolationLevel.ReadCommitted); 
     } 
} 

ответ

2

Регистрация вашей ISession с вашим IUnityContainer так:

container.RegisterType<ISession>(new InjectionFactory(c => c.Resolve<ISessionFactory>().OpenSession()); 

Затем, когда ISession требуется, ISessionFactory будет решена и сессия началась.

В приложениях я работаю, мы определяем наши хранилища и единицы работы, как так:

public class NhUnitOfWork : IUnitOfWork 
{ 
    readonly ISession _session; 

    public IRepository<T> GetRepository<T>() where T : class 
    { 
     return new NhRepository<T>(_session); 
    } 

    public NhUnitOfWork(ISession session) 
    { 
     _session = session; 
    } 

    public void Dispose() 
    { 
     // Dispose logic, i.e. save/rollback 
    } 
} 

public class NhRepository<T> : IRepository<T> where T : class 
{ 
    readonly ISession _session; 

    public void Add(T item) 
    { 
     _session.Save(item); 
    } 

    public void Delete(T item) 
    { 
     _session.Delete(item); 
    } 

    public void Update(T item) 
    { 
     _session.Update(item); 
    } 

    public NhRepository(ISession session) 
    { 
     _session = session; 
    } 
} 

Тогда ваши услуги использовать это что-то вроде этого:

public class MyService 
{ 
    readonly Func<IUnitOfWork> _unitOfWorkFactory; 

    public MyService(Func<IUnitOfWork> unitOfWorkFactory) 
    { 
     _unitOfWorkFactory = unitOfWorkFactory; 
    } 

    public void DoServiceStuff() 
    { 
     using(var uow = _unitOfWorkFactory()) 
     { 
      var newUser = new User() { Username = "My User" }; 

      var userRepo = uow.GetRepository<User>(); 
      userRepo.Add(newUser); 

      uow.Save(); 
     } 
    } 
} 
+0

Посмотрев на это - это так много –

+3

Я не знаком с фразой 'Cock on', я надеюсь, что вы означает Rock on, и вам будет приятно :) – Lukazoid

+0

Это может быть сланговый термин на Северном английском (Йоркшире)! –

0

Вы хотите создать экземпляр «IRepository», вам необходимо инициализировать сопоставление для всех его зависимостей. Это сингл: «ISession»

+0

Да, вы правы Например, я использую StructureMap, и я не знаю, как это сделать: «new InjectionFactory (c => c.Resolve (). OpenSession()" – Anton

Смежные вопросы