【问题标题】:Repository pattern with .NET 1.1.NET 1.1 的存储库模式
【发布时间】:2009-07-09 04:15:34
【问题描述】:

在 .NET 1.1 (C#) 中使用存储库模式的典型方法是什么?

我正在寻找类似于 this Stack Overflow question 的东西,除了在 .NET 1.1 中,我没有泛型,所以我只是想看看它是否可能(我确定它是) ,以及它通常是如何完成的。

【问题讨论】:

    标签: c# asp.net repository-pattern .net-1.1


    【解决方案1】:

    这很有可能,但您要么不必使用通用接口,要么进行大量转换。使用接口...

    public interface IRepository
    {
        public object Get(int id); // or object id
        public void Save(object obj);
    }
    
    public class CustomerRepository : IRepository
    {
        public object Get(int id) { // implementation }
        public void Save(object obj) { // implementation }
    }
    

    这很好用,但调用代码必须将对象转换为正确的类型,具体实现中的方法必须检查类型并抛出异常。直接转换要求运行时异常,所以我会避免这种方法。

    我建议的方法是不要让您的存储库实现通用接口。而是让他们按照约定实现常用命名的方法。

    public class CustomerRepository
    {
        public Customer Get(int id) { // implementation }
        public void Save(Customer entity) { // implementation }
    }
    
    public class EmployeeRepository
    {
        public Employee Get(int id) { // implementation }
        public void Save(Employee entity) { // implementation }
    }
    

    编辑添加:我重新阅读了链接的答案。最后一个完整的段落让我迷失了,但我可以对使用 DI 进行一些扩展。在大多数情况下,使用 DI 注入“通用”(在这种情况下意味着从公共接口派生)存储库是没有意义的。除了常用方法外,存储库还将具有特定于实体的方法,例如GetCustomersWithPastDueAccounts。您可以使用该方法定义一个 ICustomerRepository 并让您的 CustomerRepository 实现它。然后你可以使用依赖注入在运行时注入 CustomerRepository。这没有什么问题,但根据我的经验,您很少会拥有多个存储库实现,因此这样做没有什么意义。

    【讨论】:

    • 但是使用第二种方法,我不会失去注入依赖项的能力吗?
    • 你总是可以手动进行依赖注入。但是您是对的,您将无法使用 DI 框架进行依赖注入。我将编辑我的答案并添加更多解释。
    • 所以基本上,每个存储库都有一个接口,可以用于 DI。对于 10 个实体,10 个接口,至少有 10 个实现。听起来对吗?
    • 听起来不错。使它成为一个甚至一百个实体,它就有资格作为一个“企业”应用程序。使用泛型,您可以将单个具体类用作实体的存储库,该实体除了基接口中定义的功能之外没有任何其他功能。
    【解决方案2】:

    除非我误读了某些内容,否则您链接的问题中接受的答案不使用泛型。他正在定义一个接口并使用术语“通用”来表示该接口不直接绑定到模型中的任何特定表。

    【讨论】:

    • 我不认为是这样,但如果是这样,IEntityRepository 中这 7 个函数的签名会是什么样子?
    • 他指的是使用 IRepository 接口的存储库实现。
    猜你喜欢
    • 2011-08-14
    • 2021-12-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多