在Web应用程序的生命周期中实例化一次服务层和存储库

时间:2011-07-09 03:31:19

标签: c# .net design-patterns ddd-repositories

在我的Web应用程序生命周期中,我知道将调用我的所有服务和存储库。我想在Web应用程序启动期间将它们实例化一次,并在我的代码中引用实例化的引用。

在Web应用程序的生命周期中,是否存在一种常见的模式来实例化您的服务/存储库,而不会使它们成为静态或单例。

我想避免将我的服务/存储库设置为静态类或单例以实现可测试性,但是当它们被设计为无状态时,在每个Web请求上实例化它们似乎并不正确,我知道它们在生命周期中都需要它们申请。

我正在使用c#/ asp.net。

2 个答案:

答案 0 :(得分:1)

您需要的概念称为IoC / DI,并且有许多框架可供选择。如果你有一个像CustomerService这样的类,你需要一个CustomerRepository,根据定义是一个依赖,你应该通过CustomerService的构造函数传递它 - 但是有一个问题,你将实例化CustomerService?那么,谁使用该服务也应该通过constuctor获取它,它可能是CustomerPresenter,或者其他类,无关紧要。我的观点是,通过进行依赖注入,您可以将代码构建到一个非常单一的点,IoC / DI框架可以根据您的规则解析这些依赖性。

在程序的最顶端,你会有类似的东西:

ICustomerPresenter presenter = IoC.Resolve<ICustomerPresenter>();

一切都将在幕后自动汇集在一起​​。

为实现这一目标,以下是StructureMap的一个示例:

For<ICustomerPresenter>().Use<CustomerPresenter>();
For<ICustomerService>().Singleton().Use<CustomerService();
For<ICustomerRepository>().Singleton().Use<CustomerRepository>();

有了这个,你就保持了可测试性。我在这里已经简化了很多东西,所以这并不是很有用,但是有大量的IoC / DI资源在线,所以请查看它们。

注意:对于Web应用程序,您需要检查每个请求的处理生命周期,您很少会为整个Web应用程序提供单例。

答案 1 :(得分:0)

依赖注入框架将处理对象的生命周期。

例如

container.RegisterType<MyService>().Singleton();

有许多DI框架选择最适合您的方式。