2012-03-28 29 views
2

我想使用統一的IoC與工作&庫模式的單元,但是我努力工作,我的倉庫將如何得到它的NHibernate的會議上進行它的工作...注漿IUnitOfWork到IRepository構造

下面我有我的IUnityContainer它做我的IoC綁定..然後我有我的NHibernate回購需要提供一個ISession,這應該從NHibernate的工作單位提供,但我現在肯定我如何可以告訴Unity在它的構造函數中提供它..

我已經將IUnitOfWork綁定到Nhib ...一個,但是如何在IRepository 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

註冊您ISessionIUnityContainer像這樣:

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

看過這個 - 它做得很好更多的意義!公雞!乾杯! – 2012-03-29 09:21:33

+3

我不熟悉短語'公雞',我希望你意思是搖滾,不客氣:) – Lukazoid 2012-03-29 10:07:51

+0

它可能是北英語(約克郡)的俚語! – 2012-03-29 11:36:10

0

想要創建「IRepository」實例,您需要初始化所有依賴關係的映射。這是一個「的Isession」

+0

是的,你說得對,這是例子,我使用StructureMap,我不知道如何做到這一點:「新的InjectionFactory(c => c.Resolve ()。OpenSession()」 – Anton 2012-03-28 19:55:51