请参阅下面的示例静态类.
public static class BackgroundTaskExecuter { public static void MethodA() { using (var service = IocManager.Instance.ResolveAsDisposable()) { service.Object.MethodA(); } } public static void MethodB() { using (var service = IocManager.Instance.ResolveAsDisposable ()) { service.Object.MethodB(); } } public static void MethodC() { using (var service = IocManager.Instance.ResolveAsDisposable ()) { service.Object.MethodC(); } } }
如您所见,我有三种方法.MethodA
,MethodB
和MethodC
具有三个不同的接口对应IServiceA
,IServiceB
以及IServiceC
我之所以这样做是因为我使用的是带有aspnetboilerplate框架的Hangfire.io,而在Hangfire中,后台任务没有来自正常依赖注入的HttpContext.创建一个包含我手动解析的调用的静态类似乎可以解决这个问题.
用法如下:
BackgroundJob.Enqueue(() => BackgroundTaskExecuter.MethodA());
现在,我的网络应用程序中只有一两个后台任务,但可以想象我将来可能会有更多的任务,而且现在可维护,如果我采用这种方法,它最终会变得难看.
有没有更好的方法来做/重构这个?工厂模式或类似的东西也许?
谢谢.
我会使静态包装器通用且简单.让它公开一个解析服务并通过using
语句使用它的方法,允许调用者调用传入的实例Action
.
资源
public static class BackgroundTaskExecuter { public static void ResolveAndConsume(Action consumeService) { // Consider applying constraint to the to // match the constraint of ResolveAsDisposable using (var service = IocManager.Instance.ResolveAsDisposable ()) { consumeService(service); } } }
示例用法
BackgroundJob.Enqueue(() => BackgroundTaskExecuter.ResolveAndConsume(serviceA => serviceA.MethodA()));
通过上述内容,您可以解析并使用服务的实现并根据需要调用其功能.