该项目包含以下程序集:
未来可能还有另一种类型的客户端,因此所有业务逻辑都位于单独的层中。 ORM可能会被取代。目前它是EF6
UoW + Repository以下列方式实现:当ORM更改时,将有新的具体UoW和依赖于该ORM的存储库:
1)实体接口的通用和特定:
interface IRepository<T> {...}
interface IFooRepository<T>: IRepository<T> {...}
2)IUoW界面:
public interface IUoW: IDisposable
{
IFooRepository Foos{ get; }
IRepository<Bar> Bars{ get; }
int Save();
}
3)依赖于EF DbContext的具体存储库和UoW。
public class UoW: IUoW{
private MyDbContext _db;
IRepository<Bar> Bars{ get; private set; }
IFooRepository Foos{ get; private set; }
public UoW( MyDbContext db ){
_db = db;
Bars = new BarsRepository( _db );
Foos = new FoosRepository( _db );
}
//...
}
问题是当ORM更改时,我不想在许多地方从服务程序集更改我的代码。我认为使用IoC容器并在服务容器中注入UoW可能是一个好主意,但服务是在一个单独的DLL中,UI不应该知道有关存储库层的任何信息。然后我想我可能只是为服务创建一个基类,并在一个地方将它们与UoW紧密结合,但后来我失去了可测试性。
请帮助解决这个问题。还要考虑这是一个绿地项目,到目前为止一切都可以改变。作为DI框架,Unity是首选(但如果重要的话,Autofac或StructureMap也会这样做。)