2012-04-10 11 views
0

DI用にStructureMapを使用しており、MVC3カスタムベースコントローラで正しくインスタンス化できないという問題があります。 IAuctionCmsServicesのインスタンスが渡される代わりに、nullが返されます。カスタムベースコントローラを使用したMVCコントローラインジェクションが動作しない

マイコントローラー:

public class BaseController : Controller 
{ 
    public IAuctionCmsServices AuctionCmsServices; 

    public BaseController() 
     : this(null)  <--- is this the problem? 
    { 

    } 

    public BaseController(IAuctionCmsServices auctionCmsServices) 
    { 
     this.AuctionCmsServices = auctionCmsServices; 
    } 
} 

public class HomeController : BaseController 
{ 
    public ActionResult Index() 
    { 
     return View); 
    } 
} 

のStructureMapコード:global.asax.csで

public class StructureMapContainer : IDependencyResolver 
{ 
    static IContainer _container; 

    public StructureMapContainer(IContainer container) 
    { 
     _container = container; 
    } 

    public object GetService(Type serviceType) 
    { 
     if (serviceType.IsAbstract || serviceType.IsInterface) 
     { 
      return _container.TryGetInstance(serviceType); 
     } 
     else 
     { 
      System.Diagnostics.Debug.WriteLine(_container.WhatDoIHave()); 
      return _container.GetInstance(serviceType); 
     } 
    } 

    public IEnumerable<object> GetServices(Type serviceType) 
    { 
     return _container.GetAllInstances<object>().Where(s => s.GetType() == serviceType); 
    } 
} 

public class ApplicationRegistry : Registry 
{ 
    public ApplicationRegistry() 
    { 
     For<IAuctionCmsServices>().HybridHttpOrThreadLocalScoped().Use<AuctionCmsServices>(); 
    } 
} 

DependencyResolver.SetResolver(new StructureMapContainer(container)); 

BaseControllerのコンストラクタが呼び出されると、IAuctionCmsServicesパラメータがnullです。コンストラクタからthis(null)を削除すると、nullが返されます。

私のBaseControllerのparamterlessコンストラクタが正しく書かれていないのでしょうか?私がIAuctionCmsServicesを手動で解決すると、それは機能します。つまり、IAuctionCmsServicesは正しく登録されていますが、注入されていません。

+1

これは役に立つコメントではないかもしれませんが、なぜNinJectではないのですか? – Joe

+0

あなたは正しいとは言えません。私はコンテナがここで問題ではないと思う。 – rboarman

答えて

0

サンプルからコンストラクタHomeControllerを削除しましたか、持っていませんか?

私はILでいくつかのウィザードを実行しない限り、それを受け入れるコンストラクタを持たない場合、どのようにプロパティをHomeControllerに注入するのですか?

IE

public HomeController(IAuctionCmsServices auctionCmsServices) 
: base(auctionCmsServices) 
{} 

謝罪はImが密集しているか、何かが欠けている場合。

+0

HomeControllerはBaseControllerから継承します。私はカスタムベースコントローラを使いたいので、同じコンストラクタコードを多数のコントローラ間に分散する必要はありません。 – rboarman

+0

また、StructureMapにILを認識しない織り機能がない限り、派生クラスがそれを使用することがない場合、基本クラスにパラメータ化されたコンストラクタを持つことはありません。派生クラスのコンストラクターが基本クラスのコンストラクターを呼び出さない場合は、基本コンストラクターを呼び出すことはできません。 E.G BaseControllerでパラメータのないコンストラクタを削除すると、コードはコンパイルされません。 コンストラクタインジェクションの代わりにプロパティインジェクションを使用して、必要な結果を得る必要があります。 –

+0

私はその同じ判断にちょうど到着しました。ありがとうございました。 – rboarman

関連する問題