如何将静态类从.NET迁移到.NET Core?

Kem*_*siz 5 .net c# asp.net asp.net-mvc asp.net-core

我正在将一个webform(不是WebForm技术,一个精简的Web应用程序转换为webform功能)从ASP.NET MVC迁移到ASP.NET Core MVC.我目前最大的问题是我们在之前版本的webform中使用的静态类.此静态类使用.NET中可用但在.NET Core中不可用的包.

我理解对于这个静态类中的一些方法,我必须使用依赖注入来解决包问题.但是,无法将参数传递给静态类,使其成为.NET Core的"反模式".

我的Utils.cs静态类只有两个方法,RenderPartialToStringSendEmail.SendEmail非常简单,并且当前的.NET Core包没有问题.但是,我的静态类中有以下代码,不适用于当前版本.

public static class Utils
    {

        public static readonly string ApiUrl = ConfigurationManager.AppSettings["ApiUrl"];
        public static readonly string ApiKey = ConfigurationManager.AppSettings["ApiKey"];

        public static string RenderPartialToString(Controller controller, string viewName, object model)
        {
            controller.ViewData.Model = model;

            using (StringWriter sw = new StringWriter())
            {
                ViewEngineResult viewResult = ViewEngines.Engines.FindPartialView(controller.ControllerContext, viewName);
                ViewContext viewContext = new ViewContext(controller.ControllerContext, viewResult.View, controller.ViewData, controller.TempData, sw);
                viewResult.View.Render(viewContext, sw);

                return "document.write('" + sw.GetStringBuilder().Replace('\n', ' ').Replace('\r', ' ').Replace("'","\\'").ToString() + "');";
            }
        }
    ...
    }
Run Code Online (Sandbox Code Playgroud)

ViewEngine和ConfigurationManager在.NET Core中不可用,这使得此静态类很难迁移.我相信,我可以通过依赖注入实现这两个功能.但是,我不知道如何更改此静态类,以便我可以使用依赖注入,并能够在我的控制器中使用这些方法.

如何将此静态类迁移到.NET Core中以进行某些依赖注入实现?我是否需要更改Utils类的所有实例并使其不是静态的?

Joe*_*tte 9

您应该使用非静态方法将其重构为对象,然后使用DI服务注册该对象,以便将其注入控制器的构造函数或您需要的任何位置.

我实际上有一个ViewRenderer类,它具有类似的功能,我用它来使用razor生成html电子邮件.

我用DI注册它:

services.AddScoped<ViewRenderer, ViewRenderer>();
Run Code Online (Sandbox Code Playgroud)

请注意,我的ViewRenderer也有自己的构造函数依赖项,类似于静态方法中所需的依赖项:

public ViewRenderer(
        ICompositeViewEngine viewEngine,
        ITempDataProvider tempDataProvider,
        IActionContextAccessor actionAccessor
        )
    {
        this.viewEngine = viewEngine;
        this.tempDataProvider = tempDataProvider;
        this.actionAccessor = actionAccessor;

    }

    private ICompositeViewEngine viewEngine;
    private ITempDataProvider tempDataProvider;
    private IActionContextAccessor actionAccessor;
Run Code Online (Sandbox Code Playgroud)

ViewRenderer的构造函数依赖项也将通过依赖注入传递给它,所以整个想法是摆脱所有静态的东西,让所有东西都由DI提供.

如果我需要一个Controller中的ViewRenderer实例,我可以将它添加到控制器的构造函数签名中.实际上我不直接在控制器中使用它,因为我将它用于电子邮件,而是我有一个依赖于ViewRenderer的EmailService,而控制器依赖于EmailService

因此,您希望依赖注入完全依赖于所有依赖项,如果您将静态方法重构为对象实例方法,这很容易


归档时间:

查看次数:

2774 次

最近记录:

9 年,4 月 前