我正在尝试使用一些接口和Factory模式将Bll与Dal分离。 包含接口的Data.Contracts将在我的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'我的问题是: 使用工厂模式对Business层上的代码进行去耦的正确实现是什么? 我不能使用具体的实现UserRepository,因为它继承了BLL中我不想要的类。
任何帮助都将不胜感激。
答案 0 :(得分:0)
从代码的角度来看,您应该只在工厂界面上禁用“新”约束:
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<T> -> IUserRepository:IDataRepository<User> -> UserRepository
继承链。
还不清楚什么类型属于BLL。
例如,这个细分对我来说是正确的:
User
IUserRepository:IDataRepository<User>
IDataRepositoryFactory
IDataRepositoryFactory:IDataRepositoryFactory
IDataRepository<T>
UserRepository
总的来说,我建议简化代码结构并以最简单的方式开始,然后在真正需要时添加新的接口/类。