1

以下のコードプロジェクトの例で提案されている方法よりも、IOCコンテナーを使用するためのよりエレガントなパターンがあるかどうか疑問に思いました。確かに、IOCコンテナーを使用して、堅固なIOCプロセスを実行しているときに、コントローラーコンストラクターがパラメーターなしになるようにすることは可能です。また、アプリケーションにMVC(WEB-APIなど)以上のものがある場合は、そのテクノロジーに対して同じタイプのソリューションを構築していることも意味します。それは私には乾いて見えません。誰かがコンテナを「登録」するために使用する素晴らしいパターンがありますか?たとえば、IMyMagicControllerHatとして、いくつかの素晴らしい.netシステムライブラリを使用してシングルトンを取得しますか?明らかに、UI Depends on Coreがアプリケーションのモデルタイプに依存している場合は、ビルドの依存関係と静的呼び出しについて懸念があります。MVCApplicationへの静的コールバックは私に関係があります。私はより良いアプローチを探していました。

CODEProjectリンク.... http://www.codeproject.com/Articles/99361/How-To-Use-Unity-Container-In-ASP-NET-MVC-Framewor

要するに、関連するコード...

public interface IContainerAccessor
{
    IUnityContainer Container { get; }
}
public class MvcApplication : HttpApplication, IContainerAccessor
{
    private static IUnityContainer _container;
    public static IUnityContainer Container
    {
        get { return _container;        }
    }
    public static IUnityContainer Container
    {
        get  {   return _container;    }
    }

また、ソリューションとしてカスタムスタティックを示すMSのThisのような例もあります。http://msdn.microsoft.com/en-us/library/vstudio/hh323691%28v=vs.100%29.aspx 十分に確立されたアダプターパターンなどがあるのではないかと思っていました。ユニティコンテナへのアクセスは数百回になるので、パターンを正しくすることが重要に見えます。

このように完全に理にかなっているブログでさえ、元のコンテナインスタンスへの参照を取得する必要があるアプリケーションの深さを示してはいけません。 http://blog.ploeh.dk/2010/09/29/TheRegisterResolveReleasePattern.aspx

解決するための良い方法に関するヒントに感謝します。

4

2 に答える 2

3

そのcodeprojectの記事は、MVC1に基づいて2010年に公開されました。MVC3には、IoCとの統合を改善するためのIDependencyResolver実装が含まれるようになりました。また、Unityを使用するMVC3の場合は、Unity.MVC3を参照してください。

また、コンストラクターの挿入を避けたい場合は、いつでもUnityをデフォルトのIServiceLocatorとして登録できます。

ServiceLocator.SetLocatorProvider(() => new UnityServiceLocator(Container));
于 2012-12-01T00:00:32.430 に答える
0

誰かが興味を持っている場合は、グーグル検索中に:私はカスタムグローバルクラスの使用を終了しました。物事を開始するための1つの静的呼び出し。残りはインターフェース/アダプターパターンとして。この例では、UnityとEnterpriseLibraryを登録しています。また、認証されたロギング要求からの重要な詳細を記録します。 ...これは部分的な抜粋です...説明のため

MVCアプリケーションGlobal.asaxからの呼び出し

public class BosMasterWebApplication : System.Web.HttpApplication
{
    private bool IsBootStraped;

    protected void Application_Start()
    {
        AreaRegistration.RegisterAllAreas();

        WebApiConfig.Register(GlobalConfiguration.Configuration);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        AuthConfig.RegisterAuth();

        IsBootStraped = false;

    }
    public override void Init()
    {
        base.Init();
        // handlers managed by ASP.Net during Forms authentication
        AuthenticateRequest += new EventHandler(AuthHandler);
        PostAuthenticateRequest += new EventHandler(PostAuthHandler);

    }
    public void AuthHandler(object sender, EventArgs e)
    {
        // if you need to setup anything
    }
    public void PostAuthHandler(object sender, EventArgs e)
    {
        // called several times during the authentication process
        if (!IsBootStraped)
              BosGlobal.HttpBootStrap(this);
        if (Request.IsAuthenticated)
        {
            // did   FormsAuthentication.SetAuthCookie  was executed if we get here, so set username
            BosGlobal.BGA.IBosCurrentState.CurrentUser.SetFromEnvironment();
        }

    }
}


/// <summary>
/// Central adapter management. Dont abuse this class
/// </summary>
public static class BosGlobal
{
   public static IBosGlobalAdpater BGA { get; private set; }
    // set up the adapter
    static BosGlobal()
    {
         BGA = new BosGlobalAdapter( );
    }
  public static void HttpBootStrap(HttpApplication httpApplication)
    {
        BGA.BootStrap(httpApplication);
    }
    public static void LocalBootStrap(string machineName)
    { // the LOCAL WPF bootstrap alternative... no http request exists.
      BGA.BootStrap(machineName);
      }
}


public class BosGlobalAdapter : IBosGlobalAdpater
{
    public static bool IsBootStrapped { get; private set; }

    /// Unity Container with key dependencies registered
    public IUnityContainer IUnityContainer { get; private set; } //IOC Container 
    //Adapters

    public IBosLogAdapter ILogAdapter { get; private set; }
    public IBosExceptionManagerAdapter ExceptionManagerAdapter { get; private set; }
   public BosGlobalAdapter()
    {
      IsBootStrapped = false;
      IUnityContainer = new UnityContainer();// one container per work process. managing and resolving dependencies
    }

   public void BootStrap(HttpApplication httpApplication )
    {

        IBosCurrentState = new BosCurrentState(httpApplication);
      BootStrapEnterpriseLibrary();
        BootStrapAdapters();
       IsBootStrapped = true;
   }



    private void BootStrapAdapters()
    {
        ILogAdapter = new BosLogAdapter(IUnityContainer.Resolve<LogWriter>());
        ExceptionManagerAdapter = new BosExceptionManagerAdapter(IUnityContainer.Resolve<ExceptionManager>());
    }

    private void BootStrapEnterpriseLibrary()
    {   // now we tell unity about the container manager inside EntLib.
        // we dont want 2 containers, so we tell UNity look after EntLib as well please
        IUnityContainer.AddNewExtension<EnterpriseLibraryCoreExtension>();
    }
于 2012-12-05T11:40:35.193 に答える