2013-06-04 41 views
3

我有點困惑如何做到這一點與團結合作。我們假設以下場景,我有一個名爲TestController的控制器,它依賴於兩個服務ServiceA和ServiceB。現在,serviceA依賴於兩個存儲庫,RepositoryA1和RepositoryA2。 ServiceB依賴於一個Repository,RepositoryB。我們進一步假設ServiceA,RepositoryA1和RepositoryA2依賴於UnitOfWork和UnitOfWork1。我無法理解如何爲MVC3和Unity應用程序塊實現此功能。有人可以提供一個如何編碼的例子嗎?如何注入服務層到控制器時,服務層依賴於資源庫和的UnitOfWork

回答

4

有一個關於這個有很多意見,但我這是怎麼算出來爲自己

的UnitOfWork

public interface IUnitOfWork : IDisposable 
{ 
    FooContext DbContext { get; } 
    void Save(); 
} 
public class UnitOfWork : IUnitOfWork 
{ 
    protected string ConnectionString; 
    private FooContext context; 

    public UnitOfWork(string connectionString) 
    { 
     this.ConnectionString = connectionString; 
    } 

    public FooContext DbContext 
    { 
     get 
     { 
      if (context == null) 
      { 
       context = new FooContext(ConnectionString); 
      } 
      return context; 
     } 
    } 
    ... 
} 

GenericRepository這裏

public class GenericRepository<TEntity> : 
    IGenericRepository<TEntity> where TEntity : class 
{ 
    protected FooContext DbContext; 

    public GenericRepository(IUnitOfWork unitOfWork) 
    { 
     this.DbContext = unitOfWork.DbContext; 
    } 

    ... 
} 

通用庫,但他們可以同樣也要建立具體的。

服務

public class FooService : IFooService 
{ 
    private IUnitOfWork unitOfWork; 
    private IGenericRepository<Foo> fooRepository; 
    private IGenericRepository<Bar> barRepository; 

    public FooService(IUnitOfWork unitOfWork, 
         IGenericRepository<Foo> fooRepository, 
         IGenericRepository<Bar> barRepository) 
    { 
     this.unitOfWork = unitOfWork; 
     this.fooRepository = fooRepository; 
     this.barRepository = barRepository; 
    } 
} 

您仍然需要通過IUnitOfWork獲得訪問Save方法。我想我可以從其中一個倉庫獲得它。

UnityConfig

var container = new UnityContainer(); 
container.RegisterType<IUnitOfWork, UnitOfWork>(new HierarchicalLifetimeManager(), 
    new InjectionConstructor(ConnectionString)); 
container.RegisterType(typeof(IGenericRepository<>), typeof(GenericRepository<>)); 
container.RegisterType<IFooService, FooService>(); 
container.RegisterType<IBarService, BarService>(); 

控制器

private IFooService fooService; 
private IBarSevice barService; 

public HomeController(IFooService fooService, IBarService barService) 
{ 
    this.fooService = fooService; 
    this.barService = barService; 
} 
+0

因此,這將自動注入的UnitOfWork到服務和資源庫? – user1790300

+0

@ user1790300是的,因爲鏈中的每個依賴性註冊 – Jasen

+0

這將是工作單位的便利,使倉庫的性能(與延遲加載)。所以,你需要傳遞一個工作單元而不需要很長的存儲庫列表。 – eternity