2012-03-28 24 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