我已經閱讀了許多關於Stackoverflow的帖子,因爲我可以在 之內找到關於使用工作單元模式的ASP.Net MVC 3應用程序,其中包含一個業務層。然而,我仍然有幾個問題與 關於這個話題,並將不勝感激人們可以給我的任何反饋。我應該在ASP.Net MVC 3應用程序中創建工作單元實例?
我正在開發一個使用EF 4.1的ASP.Net MVC 3 Web應用程序。我將使用兩種存儲庫和 這個項目相似,它們是如何在this偉大的教程使用的單位工作模式的
在我的項目不同的是,我還需要包括業務層(單獨的項目,在我解決方案)以便 執行應用程序的各種業務規則。上面提到的教程沒有一個業務層和 因此從控制器創建工作類的單位的實例
public class CourseController : Controller
{
private UnitOfWork unitOfWork = new UnitOfWork();
不過,我的問題是,我應該創建工作單元的實例如果我有一個業務層的課程?
我個人認爲它應該在我的控制器被創建,然後注入到業務層,像這樣:
public class PeopleController : Controller
{
private readonly IUnitOfWork _UoW;
private IPersonService _personService;
public PeopleController()
{
_UoW = new UnitOfWork();
_personService = new PersonService(_UoW);
}
public PeopleController(IUnitOfWork UoW, IPersonService personService)
{
_UoW = UoW;
_personService = personService;
}
public ActionResult Edit(int id)
{
Person person = _personService.Edit(id);
return View(person);
}
public class UnitOfWork : IUnitOfWork, IDisposable
{
private BlogEntities _context = new BlogEntities();
private PersonRepository personRepository = null;
public IPersonRepository PersonRepository
{
get
{
if (this.personRepository == null)
{
this.personRepository = new PersonRepository(_context);
}
return personRepository;
}
}
public void Save()
{
_context.SaveChanges();
}
public class PersonService : IPersonService
{
private readonly IUnitOfWork _UoW;
public PersonService(IUnitOfWork UoW)
{
_UoW = UoW;
}
public Person Edit(int id)
{
Person person = _UoW.PersonRepository.GetPersonByID(id);
return person;
}
public class PersonRepository : IPersonRepository
{
private readonly BlogEntities _context;
public PersonRepository(BlogEntities context)
{
_context = context;
}
public Person GetPersonByID(int ID)
{
return _context.People.Where(p => p.ID == ID).Single();
}
我看過別人說,工作實例的單位不應該在控制器,但改爲在服務層 中創建。我對此方法不太確定的原因是因爲我的控制器可能必須在一個業務事務中使用幾個不同的服務層,並且如果在每個服務中創建工作單元實例,則會導致多個 單元的正在創建的工作實例違背了目標,即每個業務事務中的一個工作單元。或許我上面解釋過的是錯誤的,但如果是這樣的話,我會非常感謝,如果有人能把我說得對。
再次感謝您的幫助。
感謝史蒂夫。目前我從來沒有使用或實施過DI容器,但我絕對不排除它。但是,對於這個應用程序,我正在構建,如果我選擇不實施DI容器並保留手動DI,那麼我在我的問題中提到的代碼(特別是將UoW注入服務)仍然可以使用嗎? – tgriffiths 2012-02-03 09:23:11
你當然可以手動將所有東西連接在一起;在這種情況下,你必須使用第二個選項來創建一個使用'HttpContext.Current.Items'來對每個請求存儲實體對象的對象。無論您是否使用容器,我仍然會說'UnitOfWork'應該進入服務層;我已經更新了我的答案,以澄清這一點:) – 2012-02-03 10:43:11
再次感謝史蒂夫,雖然我似乎越來越困惑!你說我需要創建一個對象,它使用 HttpContext.Current.Items 來存儲我的實體在每個請求的基礎上,但我的ObjectContext將存儲/管理我的實體,它將創建 在我的單位工作類和UoW將只存在於每個HTTP請求中。 – tgriffiths 2012-02-03 16:45:32