2016-08-08 7 views
4

Я переношу веб-форму (а не технологию WebForm, урезанное веб-приложение в функциональность веб-формы) из ASP.NET MVC в ASP.NET Core MVC. Моя самая большая проблема - это статический класс, который у нас был в предыдущей версии веб-формы. Этот статический класс использует пакеты, которые были доступны в .NET, но не в .NET Core.Как перенести статический класс с .NET на .NET Core?

Я понимаю, что для некоторых методов в этом статическом классе я должен использовать инъекцию зависимостей для решения проблем с пакетом. Тем не менее, невозможно передать параметр статическому классу, что делает это «антипаттерн» для .NET Core.

Мой статический класс Utils.cs имеет только два метода: RenderPartialToString и SendEmail. 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() + "');"; 
      } 
     } 
    ... 
    } 

ViewEngine и ConfigurationManager не доступны в .NET Ядро делает этот статический класс очень трудно перенести. Я считаю, что я мог бы реализовать обе эти функции с помощью инъекции зависимостей. Однако я не знаю, как изменить этот статический класс, чтобы я мог использовать инъекцию зависимостей и иметь возможность использовать эти методы в моих контроллерах.

Как я могу просто перенести этот статический класс в .NET Core для какой-либо реализации инъекции зависимостей? Мне нужно изменить все экземпляры класса Utils и сделать его не статическим?

+1

Э-э-э-э-э-э-эй? msgstr "приложение веб-формы из ASP.NET MVC ..."? ASP.NET MVC - это другая технология, чем ASP.NET (aka WebForms). – Tseng

+2

См. Http://stackoverflow.com/questions/31905624/where-are-the-controllercontext-and-viewengines-properties-in-mvc-6- контроллер для части ViewEngine.Для ConfigurationManager вам нужно «IOption » https://docs.asp.net/en/latest/fundamentals/configuration.html – Kalten

+0

@Tseng Извините, что не уточнил, это урезанное веб-приложение с использованием MVC (а не WebForms). Следовательно, это не технология WebForm. –

ответ

8

Вы должны реорганизовать его в объект с нестационарными методами, а затем зарегистрировать объект с помощью служб DI, чтобы его можно было вставить в конструктор вашего контроллера или там, где вам это нужно.

У меня на самом деле есть ViewRenderer class with similar functionality here, который я использую для генерации html-сообщения с помощью бритвы.

зарегистрировать его DI, как это:

services.AddScoped<ViewRenderer, ViewRenderer>(); 

Обратите внимание, что мой 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; 

зависимости конструктора ViewRenderer своей воли также должны быть переданы им путем инъекции зависимостей, поэтому вся идея состоит в том, чтобы уйти от всего статического материала и позволить всему обеспечить DI.

Если мне нужен экземпляр ViewRenderer в контроллере, я могу просто добавить его в подпись конструктора контроллера. На самом деле я не использую его непосредственно в контроллере, так как я использую его для электронной почты, вместо этого у меня есть служба EmailService, которая зависит от ViewRenderer, и контроллер зависит от EmailService

, так что вы хотите получить инъекцию зависимостей вплоть до все зависимости, которые легко удаляются из статических методов в методы экземпляра объекта.

-1

Хотя я бы пошел с пуском @ Joe, может быть другой способ для вашего дела. Чтобы использовать способ расширения контроллера:

// register configuration 
public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddSingleton<IConfiguration>(Configuration); 
} 

public static class ControllerExtension 
{ 
    public static string RenderPartialToString(this Controller controller, string viewName, object model) 
    { 
     controller.ViewData.Model = model; 
     var config = controller.HttpContext.RequestServices.GetService<IConfiguration>(); 
     // other stuff 
    } 
} 
+0

Вы вообще не должны иметь понятия " конфигурации "во время основного выполнения. Концепция с ASP.NET Core - это настройка во время init, создание IApiService или что-то еще, и использование этого через DI. –

Смежные вопросы