【问题标题】:Decoupling the Dal Repository using the Factory pattern使用工厂模式解耦 Dal 存储库
【发布时间】:2013-12-11 05:23:24
【问题描述】:

我正在尝试使用一些接口和工厂模式将 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”

我的问题是: 哪个是使用工厂模式解耦业务层代码的正确实现? 我不能使用具体实现 UserRepository,因为它继承自 BLL 中我不想要的类。

任何帮助将不胜感激。

【问题讨论】:

    标签: architecture repository factory-pattern decoupling


    【解决方案1】:

    从代码的角度来看,您应该只禁用工厂接口上的“新”约束:

    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&lt;T&gt; -&gt; IUserRepository:IDataRepository&lt;User&gt; -&gt; UserRepository 继承链。

    也不清楚哪些类型属于 BLL。

    例如,这个细分在我看来没问题:

    • BLL:
      • User
      • IUserRepository:IDataRepository&lt;User&gt;
    • DAL/基础设施:
      • IDataRepositoryFactory
      • IDataRepositoryFactory:IDataRepositoryFactory
      • IDataRepository&lt;T&gt;
      • UserRepository

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

    【讨论】:

    • 谢谢,我在我的实现中发现了一个不能正常工作的约束,我用更简单的模型和 DI 重建了一个小型控制台应用程序并解决了。
    猜你喜欢
    • 2010-09-22
    • 1970-01-01
    • 2014-12-10
    • 2023-03-21
    • 1970-01-01
    • 2012-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    相关资源
    最近更新 更多