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