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