Entity framework Autofac存储库模式和工作单元

Entity framework Autofac存储库模式和工作单元,entity-framework,design-patterns,repository,autofac,unit-of-work,Entity Framework,Design Patterns,Repository,Autofac,Unit Of Work,我已经搜索了一点,我很困惑 使用Autofac为每个实体使用存储库和服务。工作类的单元没有存储库。因此,您应该创建每个存储库,而不仅仅是在调用方构造函数中创建一个工作类单元 OrderService(IUnitOfWork unitOfWork, IUserRepository userRepository,IOrderRepository orderRepository,IBalanceRepository balanceRepository) OrderService(IUnitOfWor

我已经搜索了一点,我很困惑

使用Autofac为每个实体使用存储库和服务。工作类的单元没有存储库。因此,您应该创建每个存储库,而不仅仅是在调用方构造函数中创建一个工作类单元

OrderService(IUnitOfWork unitOfWork, IUserRepository userRepository,IOrderRepository orderRepository,IBalanceRepository balanceRepository)
OrderService(IUnitOfWork unitOfWork)
只使用通用存储库。它使用扩展类,而不是为每个实体使用一个存储库。工作单元类具有通用存储库。因此,您可以在调用方类构造函数上创建工作单元类

OrderService(IUnitOfWork unitOfWork, IUserRepository userRepository,IOrderRepository orderRepository,IBalanceRepository balanceRepository)
OrderService(IUnitOfWork unitOfWork)
在这种方法中,我们为存储库使用一个通用类,但为每个实体创建一个存储库对象。如果这种方法很好,我如何用Autofac实现它

使用一个通用存储库和一个对象作为Autofac的通用存储库。它使用泛型方法而不是泛型类。但通用存储库具有工作类的单元,而不是相反的单元。这是反模式吗

OrderService(IUnitOfWork unitOfWork,IGenericRepository repository)

我应该使用哪种方法?

我使用第二种方法,IUnitOfWork只是一个接口,后面我使用ef

public interface IUnitOfWork:IDisposable
{        
    IRepository<T> GetRepository<T>() where T:class;        
    int SaveChanges();
}
为了实现GetRepository方法,您应该添加一个适配器类,从dbset到irepository

    public IRepository<T> GetRepository<T>() where T:class
    {
        return new RepositoryEfAdapter<T>(Set<T>(), this);
    }
public IRepository GetRepository(),其中T:class
{
返回新的repositoryfadapter(Set(),this);
}

这是一个示例,您可以将datacontext注册为iunitofwork

工作单元和存储库模式的意义在于准确描述用例所需的内容。因此,与返回IQueryable的存储库一样,要避免为每个实体都有存储库或可以通过通用方法为任何实体创建存储库的工作单元。最后一个缺陷会将Dal移动到域模型甚至UI(想象一下过滤器逻辑被写入何处、过滤器何时执行以及异常将被抛出何处),第一个缺陷会创建一种单解析应用程序,并使编写单元测试变得困难。只有用例所需的3个存储库和只有所需方法的3个存储库(接口)的工作单元(接口),返回单个对象或对象列表更容易模拟和测试,并准确地指定用例所需的内容,并将其传达给其他开发人员(或者你自己在2年内)这些接口可以由一个大的工作单元类和一些标准的存储库类来实现(如果你选择的话),但这是一个不同的决定,应该由技术来指导(早期版本中的EF代码first不能在一个数据库中有多个上下文)和应用程序的复杂性。

我使用MongoDB。因此,我将使用sql和实体框架来处理事务表。这意味着,sql db中最多有5个表。所以我可以使用第一种方法吗?因为你说我必须避免“工作单元,它为每个实体都有存储库,或者可以通过Generer为任何实体创建存储库。”ic方法。工作单元和存储库模式本身对此没有太多说明。但我读了很多书(关于可靠和干净的代码)其中IQueryable存储库是一种反模式,也是一种全局模式,适用于所有工作单元。这与模式无关,但更易于理解和测试的代码以及松散的封装。谢谢您的回答。在第一种方法中,它实际上不使用工作单元模式。工作单元类没有任何存储单元我不使用任何IQueryable存储库,所以我不能在服务层操作数据。我将从第一种方法开始,然后根据需要更改它。