当前位置:  开发笔记 > 编程语言 > 正文

在c#中重构这个静态类的最佳方法是什么?

如何解决《在c#中重构这个静态类的最佳方法是什么?》经验,为你挑选了1个好方法。

请参阅下面的示例静态类.

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,MethodBMethodC具有三个不同的接口对应IServiceA,IServiceB以及IServiceC

我之所以这样做是因为我使用的是带有aspnetboilerplate框架的Hangfire.io,而在Hangfire中,后台任务没有来自正常依赖注入的HttpContext.创建一个包含我手动解析的调用的静态类似乎可以解决这个问题.

用法如下:

BackgroundJob.Enqueue(() => BackgroundTaskExecuter.MethodA());

现在,我的网络应用程序中只有一两个后台任务,但可以想象我将来可能会有更多的任务,而且现在可维护,如果我采用这种方法,它最终会变得难看.

有没有更好的方法来做/重构这个?工厂模式或类似的东西也许?

谢谢.



1> David Pine..:

我会使静态包装器通用且简单.让它公开一个解析服务并通过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()));

通过上述内容,您可以解析并使用服务的实现并根据需要调用其功能.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有