【发布时间】: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
在 .NET 1.1 (C#) 中使用存储库模式的典型方法是什么?
我正在寻找类似于 this Stack Overflow question 的东西,除了在 .NET 1.1 中,我没有泛型,所以我只是想看看它是否可能(我确定它是) ,以及它通常是如何完成的。
【问题讨论】:
标签: c# asp.net repository-pattern .net-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。这没有什么问题,但根据我的经验,您很少会拥有多个存储库实现,因此这样做没有什么意义。
【讨论】:
除非我误读了某些内容,否则您链接的问题中接受的答案不使用泛型。他正在定义一个接口并使用术语“通用”来表示该接口不直接绑定到模型中的任何特定表。
【讨论】: