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

本文关键字:一次 服务 存储 应用程序 web 生命 周期 实例化 | 更新日期: 2023-09-27 18:01:41

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

在web应用程序的生命周期中,是否存在一种通用的模式来实例化你的服务/存储库一次,而不使它们成为静态的或单例的?

我想避免让我的服务/存储库静态类或单例可测试性,但实例化它们在每个web请求似乎不正确,当他们被设计为无状态,我知道他们都将需要在应用程序的生命周期。

我正在使用c#/asp.net

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

您需要的概念称为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应用程序使用单例。

依赖注入框架将负责你的对象的生命周期。

container.RegisterType<MyService>().Singleton();
有很多DI框架可以选择最适合你的。