2012-03-28 14 views
2

Ich versuche, die Unity IoC mit der Arbeitseinheit & Repository-Muster zu verwenden, jedoch bin ich kämpfen, herauszufinden, wie mein Repository bekommen würde es NHibernate Sitzung ausführen es Arbeit ist ...Injecting IUnitOfWork in IRepository Konstruktor

Unten habe ich meinen IUnityContainer, der meine IoC-Bindungen macht. Ich habe dann meinen NHibernate Repo, der mit einer ISession bereitgestellt werden muss, die von der NHibernate-Einheit der Arbeit bereitgestellt werden sollte, aber ich bin mir jetzt sicher, wie ich Unity sagen kann um es in seinem Konstruktor zur Verfügung zu stellen.

Ich habe eine Bindung für die IUnitOfWork zu einem Nhib ... gemacht, aber wie übergibt man diesen Wert im IRepository RegisterType?

Antwort

2

Registrieren ISession mit Ihrem IUnityContainer wie so:

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

Dann, wenn ein ISession erforderlich ist, wird ein ISessionFactory aufgelöst werden und eine Sitzung gestartet.

In den Anwendungen, die ich auf Arbeit definieren wir unsere Repositories und Arbeitseinheit wie folgt:

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; 
    } 
} 

Dann nutzen Sie Ihre Dienstleistungen, die es so etwas wie dieses:

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

Nach dem Betrachten - Es macht so viel mehr Sinn! Cock on! Prost! –

+3

Ich bin nicht vertraut mit der Phrase "Cock on", ich hoffe es Mean Rock an, und Sie sind willkommen :) – Lukazoid

+0

Es könnte ein North English (Yorkshire) Slang Begriff sein! –

0

Sie möchten Instanz von "IRepository" erstellen, müssen Sie Mapping für alle Abhängigkeiten initialisieren. Es ist einfach: „ISession“

+0

Ja, Du hast Recht Es ist ein Beispiel, ich benutze StructureMap und ich habe nicht gewusst, wie man das macht: "neue InjectionFactory (c => c.Resolve (). OpenSession()" – Anton