你需要使用
工作单元
和
仓储
模式,并结合像
StructureMap或
Unity这样的依赖注入框架。基本上,你需要创建接口:
public interface IUnitOfWork
{
void SaveChanges();
}
public interface IRepository<TItem>
{
TItem GetByKey<TKey>();
IQueryable<TItem> Query();
}
现在,在您的
DbContext
类中实现上述接口,并在业务层的某个地方注册接口的实现:
public void RegisterDependencies(Container container)
{
container.ForRequestedType<IUnitOfWork>()
.CacheBy(InstanceScope.HttpContext)
.TheDefaultConcreteType<DbContext>();
}
请查看StructureMap Scoping Docs,了解如何配置实例的范围。
现在,完成所有代码编写后,每个需要执行一些数据操作的Business Layer
类会像这样:
public class SomeService
{
public SomeService(IRepository<SomeItem> repository, IUnitOfWork unitOfWork)
{
this.repository = repository;
this.unitOfWork = unitOfWork;
}
public void MarkItemCompleted(int itemId)
{
var item = repository.GetByKey(itemId);
if(item != null)
{
item.Completed = true;
unitOfWork.SaveChanges();
}
}
}
现在,将服务的创建隐藏在工厂后面:
public class ServiceFactory
{
private readonly Container container;
public TService CreateService<TService>()
{
return container.GetInstance<TService>();
}
}
在您的GUI层中,只调用通过ServiceFactory
创建的服务类的方法;如果您的GUI是一个ASP.NET MVC项目,则不需要创建ServiceFactory
类 - 您可以从DefaultControllerFactory
派生,并重写GetControllerInstance
方法。有关示例,请参见此处的答案。