1

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

是否有一种通用模式可以在 Web 应用程序的生命周期内仅实例化一次服务/存储库,而不使它们成为静态或单例。

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

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

4

2 回答 2

1

您需要的概念称为 IoC / DI,并且有很多框架。当你有一个像 CustomerService 这样的类并且你需要一个 CustomerRepository 时,根据定义,这是一个依赖项,你应该通过 CustomerService 的构造函数传递它——但是问题是你将在哪里实例化 CustomerService?好吧,使用该服务的人也应该通过构造函数获得它,它可能是 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 应用程序的单例。

于 2011-07-09T07:42:06.067 回答
0

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

例如

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

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

于 2011-07-09T03:47:45.507 回答