2016-08-08 5 views
4

私は、ASP.NET MVCからASP.NET Core MVCへのWebform(WebFormテクノロジではなく、Webアプリケーションを取り除いたもの)をASP.NET MVCに移行しています。私の現在の最大の問題は、Webフォームの以前のバージョンで持っていた静的なクラスです。この静的クラスは.NETで利用可能でしたが.NETコアでは利用できなかったパッケージを使用します。静的クラスを.NETから.NETコアに移行する方法は?

この静的クラスのメソッドのいくつかについては、パッケージの問題を解決するために依存性注入を使用する必要があることを理解しています。ただし、静的クラスにパラメータを渡すことはできません。これを.NETコアの「反パターン」にします。

My Utils.cs静的クラスには、RenderPartialToStringSendEmailという2つのメソッドしかありません。 SendEmailは非常にシンプルで、現在の.NETコアパッケージに問題はありません。しかし、私は現在のバージョンで動作しない私の静的クラスに次のコードがあります。

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コアに単純に移行できますか? Utilsクラスのすべてのインスタンスを変更して静的でないようにする必要はありますか?

+1

"ASP.NET MVCからのWebフォームアプリケーション..." ASP.NET MVCはASP.NET(別名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(Webフォームではありません)を使用しているWebアプリケーションを削除しました。したがって、WebFormテクノロジではありません。 –

答えて

8

非静的メソッドでオブジェクトにリファクタリングし、オブジェクトをDIサービスに登録して、コントローラのコンストラクタまたは必要な場所に注入できるようにします。

私は実際には、かみそりを使ってhtml電子メールを生成するために使用するViewRenderer class with similar functionality hereを持っています。

私はこのようなDIに登録:

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のコンストラクタ依存します:私はViewRendererはまた、あなたの静的メソッドで必要なものに似て、それ自身のコンストラクタの依存関係を持っていることを

services.AddScoped<ViewRenderer, ViewRenderer>(); 

は注意依存性注入によってそれにも渡すことができるので、すべての静的なものから離れて、すべてがDIによって提供されるようにすることが考えられます。

コントローラでViewRendererのインスタンスが必要な場合は、コントローラのコンストラクタシグネチャに追加するだけで済みます。実際には私は電子メールのためにそれを使用しているのでコントローラに直接使用しないで、代わりにViewRendererに依存するEmailServiceを持っていてコントローラは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経由で使用したりすることです。 –

関連する問題