在我的Web应用程序生命周期中,我知道将调用我的所有服务和存储库。我想在Web应用程序启动期间将它们实例化一次,并在我的代码中引用实例化的引用。
在Web应用程序的生命周期中,是否存在一种常见的模式来实例化您的服务/存储库,而不会使它们成为静态或单例。
我想避免将我的服务/存储库设置为静态类或单例以实现可测试性,但是当它们被设计为无状态时,在每个Web请求上实例化它们似乎并不正确,我知道它们在生命周期中都需要它们申请。
我正在使用c#/ asp.net。
答案 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框架选择最适合您的方式。