Architecture 使用工厂模式解耦Dal存储库

Architecture 使用工厂模式解耦Dal存储库,architecture,repository,factory-pattern,decoupling,Architecture,Repository,Factory Pattern,Decoupling,我正在尝试使用一些接口和工厂模式将Bll与Dal分离。 数据。包含接口的合同将在我的Bll上引用 这是一个小测试代码: class Program { static void Main(string[] args) { IDataRepositoryFactory _DataRepositoryFactory; IUserRepository userRepository = _DataRepositoryFactory.GetDataReposi

我正在尝试使用一些接口和工厂模式将Bll与Dal分离。 数据。包含接口的合同将在我的Bll上引用

这是一个小测试代码:

class Program
{
    static void Main(string[] args)
    {
        IDataRepositoryFactory _DataRepositoryFactory;
        IUserRepository userRepository = _DataRepositoryFactory.GetDataRepository<IUserRepository>();
     }
}


public abstract class RepositoryBase<T> where T : class, new() { }
public class UserRepository : RepositoryBase<User>, IUserRepository 
{
    public UserRepository() { }
}

public class DataRepositoryFactory : IDataRepositoryFactory
{
    public T GetDataRepository<T>() where T : IDataRepository, new()
    {
        return ObjectBase.Container.GetExportedValue<T>();
    }
}

public class User 
{
    public int Id { get; set; }
}

public abstract class ObjectBase
{
    public ObjectBase() { }

    public static CompositionContainer Container { get; set; }

}

public interface IDataRepository { }

public interface IDataRepository<T> : IDataRepository where T : class, new() { }

public interface IUserRepository : IDataRepository { }

public interface IDataRepositoryFactory
{
    T GetDataRepository<T>() where T : IDataRepository, new();
}
最后我犯了一个错误:

“Data.Contracts.IUserRepository”必须是具有公共无参数构造函数的非抽象类型,以便 将其用作泛型类型或方法“Data.Contracts.IDataRepositoryFactory.GetDataRepository”中的参数“T”

我的问题是: 使用工厂模式在业务层上解耦代码的正确实现是什么? 我不能使用具体的实现UserRepository,因为它继承自我不希望在BLL中使用的类


如果有任何帮助,我们将不胜感激。

从代码的角度来看,您只需禁用factory界面上的新约束即可:

public interface IDataRepositoryFactory
{
    T GetDataRepository<T>() where T : IDataRepository; //, new();
}

public class DataRepositoryFactory : IDataRepositoryFactory
{
    public T GetDataRepository<T>() where T : IDataRepository//, new()
    {
        return ObjectBase.Container.GetExportedValue<T>();
    }
}
从设计角度来看,存储库看起来有点复杂:

对我来说,IDataRepository非泛型和RepositoryBase似乎是多余的,但这取决于具体情况,可能你没有提供足够的细节。我会使用IDataRepository->IUserRepository:IDataRepository->UserRepository继承链

此外,还不清楚哪些类型属于BLL

例如,在我看来,这一细分是正确的:

BLL: 使用者 IUserRepository:IDataRepository DAL/基础设施: 爱达宝地工厂 IDataRepository工厂:IDataRepository工厂 IDataRepository 用户存储库
总的来说,我建议简化代码结构,从最简单的方式开始,然后在您真正需要的时候添加新的接口/类。

谢谢,我在实现中发现了一个不起作用的约束,我重建了一个小型控制台应用程序,具有更简单的模型和DI,并解决了这个问题。