2013-04-05 55 views
0

我碰到了一個試圖設置DI的小路障。如何使用Ninject將服務層添加到我的UnitOfWork?

所以因爲我有這個控制器:

public UsersController(IUnitOfWork unitOfWork) 
{ 
    // Stuff 
} 

我以前有直接訪問我的版本庫,這個實現的UnitOfWork。

public class UnitOfWork : IUnitOfWork, IDisposable 
{ 
    private readonly DbContext _context = new DbContext(); 

    public IRepository<User> Users { get { return new UserRepository(_context); } } 
} 

Ninject的UnitOfWork代碼:Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();

現在,這實際上是正常工作。不過,我想改變它,以便代替包含存儲庫的UnitOfWork,它包含接收多個存儲庫的服務。

public class UserService : IUserService 
{ 
    private readonly IUserRepository _userRepository; 
    public UserService(IUserRepository userRepository, /* Other repositories */) 
    { 
    _userRepository = userRepository; 
    } 
} 

現在唯一的解決辦法我能想出是

public class UnitOfWork : IUnitOfWork, IDisposable 
{ 
    private readonly DbContext _context = new DbContext(); 

    public IUserService UserService 
    { 
    get 
    { 
     return new UserService(new UserRepository(_context), /* etc. */); 
    } 
    } 
} 

這看起來不正確。現在我自己創建所有的服務依賴關係。

我在StackOverflow上看過帖子,提到最好讓服務訪問多個存儲庫並處理業務邏輯,而不是讓控制器(MVC應用程序)擔心它。

雖然沒有找到關於如何正確實際執行此操作的任何細節。那麼我怎麼能用Ninject來做我以後的事情呢?

+0

相關:http://stackoverflow.com/questions/10585478/one-dbcontext-per-web-request-why/10588594#10588594 – 2013-04-05 23:11:31

回答

2

對不起,這的確是一個雜草叢生的評論,但哎...

一個DbContext工作單元,並創建一個跨越兩個DbContexts工作單位怪物,絕對不是一般的模式(因此你的問題sez你)

對此answer here to a related question的評論偏離到同一領域。

問題要問自己嘗試解決這種方式之前:

  • 什麼是你試圖用本機我的工作完成以後具有的DbContext?
  • 這是否需要交易?
  • 中間是否實際存在缺失的服務,應該有自己的數據引用另外兩個服務?
  • 這是否需要跨越兩個有界上下文?如果你以後需要再把它們拉出來怎麼辦?
  • 如果我在應用程序中有3個這種情況,我會不會將它們合併到一個BC中? 4?

對我來說,關鍵在於創建自己的UOW包裝一個UOW:

  1. 不買你多少
  2. 使得它更難推理的核心問題

如果你仍然用Ninject的方式來解決這個問題,技術方法是使用Context Preservation和Factory Extensions tog以太 - 請閱讀他們的wiki中的例子。如果你決定剝離事情,他們可能還有一些部分可以玩。

更新:我現在趕上你的漂移 - 重要的是要鏈接到那些引導你的想法的東西。首先,請閱讀this。接下來,決定是否要創建一個工作單元。如果是這樣,誰來提交併處理它?

如果存儲庫和/或服務要共享一個UoW或一個DBContext,並且要集中提交一些東西,那麼您將要共享/處置的事情綁定到InRequestScope中,以使其a)獲得單個共享實例b)得到處置

我的主要擔心是否所有這些抽象都是真正有益的事情 - 您是否真的在編寫使用抽象的測試(而不僅僅是前幾個)?你真的要切換存儲庫嗎?我個人會多次閱讀DDD書籍,作爲更好的時間投資。

我意識到很多這是高度光顧,這只是一個簡單的問題,代表一個更大的問題的一部分,但我剛剛看到太多的問題最近由包裝層和DI容器欺騙的交集因此我咆哮。 Rant完整,謝謝!

+0

感謝您的答案。我擁有的代碼是建立在他們在MVC站點上的示例中的:http://www.asp.net/mvc/tutorials/getting-started-with-ef-using-mvc/implementing-the-repository-and-工作單元模式在asp-net-mvc-application中如果這是一個壞主意,那麼我會考慮替代解決方案。真的,我唯一想避免的是將所有業務邏輯放在控制器中,並且由於它不屬於存儲庫,所以我認爲它適用於服務層。這意味着我應該分享DbContext,這是我認爲UnitOfWork類的目的。 – Brandon 2013-04-05 22:20:59

+0

另外,你能澄清你的意思是兩個有界的上下文嗎?我不太理解。我將上下文的相同實例傳遞給多個存儲庫,那麼爲什麼會有兩個上下文? – Brandon 2013-04-05 22:22:14

+0

@Brandon Def保留一個服務層,並將操作推出。它是DbContext的同一個實例,我的大多數評論都不適用。你可以綁定'DbContext''InRequestScope'和需要它的東西請求一個'Func '並將其封裝在'using'中。 – 2013-04-05 22:26:04

相關問題