在C#中注册和检索存储库的正确(最佳)方法

时间:2013-04-12 01:44:03

标签: c# inversion-of-control repository-pattern

我正在开发的项目有很多用于传递Repository对象的样板代码。父对象创建一个存储库,将其传递给任何实用程序/辅助方法以执行某些特定工作,然后最终父对象调用提交或保存在存储库中。很多时候,这些实用程序/辅助方法调用其他方法,这也需要存储库。首先,我们肯定错误地使用了存储库模式,因为这些辅助方法中的许多实际上只是将存储库用作DAO甚至只是数据库连接,运行快速查询并完成它。我的问题是避免必须通过这些存储库的最佳方法是什么?

最原始的方法是在这些辅助方法中创建存储库,然后销毁它们(使用子句),并且存在明显的缺点,并且它是针对DRY的。

我还看到人们将这些存储库注册为服务的示例,并以这种方式使用它们。

请考虑线程安全。

对此有何专家意见?任何例子都将非常感激。

PS。我是一名高级Java人员,但几乎是C#的入门级别,因此任何与java相关的比较都会很棒。

1 个答案:

答案 0 :(得分:2)

注册和检索存储库的“正确”方法是使用DI容器(我建议Autofac

builder.RegisterType<MyRepository>().AsImplementedInterfaces().InstancePerLifetimeScope();

InstancePerLifeTimeScope 表示它的线程作用域,因此每个线程只有一个实例。需要存储库的每个对象都将存储库接口作为构造函数依赖项。对于某些服务,存储库可以是方法参数。

存储库将使用(微)ORM与数据库“对话”。在某些情况下,您需要数据甚至可以直接从数据库中检索的某些对象。在这种情况下,您有一个服务而不是存储库,尽管两个实现(不是接口)都属于DAL。

我假设所有服务和存储库都作为抽象传递,因此需要服务或存储库的每个对象都只知道IService或IRepository。 DI容器将注入具体类型,客户端对象不需要知道这些。