Architecture 使用工厂模式解耦Dal存储库
我正在尝试使用一些接口和工厂模式将Bll与Dal分离。 数据。包含接口的合同将在我的Bll上引用 这是一个小测试代码: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
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,并解决了这个问题。