使用Factory模式解耦Dal Repository

时间:2013-12-07 19:34:22

标签: architecture repository factory-pattern decoupling

我正在尝试使用一些接口和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中我不想要的类。

任何帮助都将不胜感激。

1 个答案:

答案 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。

例如,这个细分对我来说是正确的:

  • BLL:
    • User
    • IUserRepository:IDataRepository<User>
  • DAL /基础设施:
    • IDataRepositoryFactory
    • IDataRepositoryFactory:IDataRepositoryFactory
    • IDataRepository<T>
    • UserRepository

总的来说,我建议简化代码结构并以最简单的方式开始,然后在真正需要时添加新的接口/类。