我正在使用以下T4创建我的存储库& UOW: http://blogs.microsoft.co.il/blogs/gilf/archive/2010/07/05/repository-and-unit-of-work-t4-template-for-entity-framework.aspx
现在我正在尝试添加服务层。我能够完成这样的事情:
public ActionResult Index()
{
using (DataEntities context = new DataEntities())
{
UnitOfWork uow = new UnitOfWork(context);
//Service
ClientService cli = new ClientService(uow);
var col = cli.getActive();
//Map results to ViewModel
var list = AutoMapper.Mapper.Map<IEnumerable<Client>, IEnumerable<ClientListViewModel>>(col);
return View(list);
}
}
这很好,但是......
将UoW实例传递到服务层在架构上是否正确?
(我在其ctor中使用IUnitOfWork)
我试图移动上下文&amp;在服务层内部,但是当我尝试将结果映射到控制器中的ViewModel时,上下文不可用。
谢谢!
答案 0 :(得分:1)
我认为不是不是。再说一遍,我不是工作单位的忠实粉丝 - 我觉得它太知道了。我会将必要的存储库(ies)传递给您创建的服务。通常情况下,我最终会使用特殊的“GetService”或“CreateService”,但这可能对你有用...(我写的是徒手写的,因此可能无法构建)
Public class DoSomethingCoolService : IDoSomethingCoolService
{
private IRepository<SomethingINeed> _neededRepository;
public DoSomethingCoolService(connectionOrContext)
{
//setup
}
public DoSomethingCoolService(IRepository<SomethingINeed> neededRepository)
{
_neededRepository = neededRepository;
}
public List<SomethingINeed> ReturnWhatIWant()
{
_neededRepository.Where(x => x.WhatIWant = true);
}
}
就个人而言,我不喜欢这个。我更喜欢这样的东西...
public interface IGetService<T>
{
//usual get suspects here
}
public class GetService<T> : IGetService<T>
{
private IRepository<T> _repository;
GetService(IRepository<T> repository)
//use repository to call gets
}
现在是复杂的东西...
public interface IGetClientService : IGetService<Client>
{
List<Client> GetClientsForSomething(int someId);
}
public class GetClientService : GetService<Client>, IGetClientService
{
private IRepository<Client> _repository;
GetClientService(IRepository<Client> repository) : base(repository)
public List<Client> GetClientsForSomething(int someId)
{
//some crazy cool business logic stuff here you want to test!
}
}
然后在我的控制器中,我只依赖于IGetClientService,并在必要时使用它。易于测试,易于制作不依赖于它的另一个。
这有意义吗?