2011-09-13 11 views
3

これはasp.net mvc3です。構造マップがHomeControllerを取得しないのはなぜですか?

私は試してみて、私の自宅/ indexアクションに行くとき:

public class HomeController : Controller 
    { 
     private IBar bar; 

     public HomeController(IBar bar) 
     { 
      this.bar = bar; 
     } 

     // 
     // GET: /Home/ 

     public ActionResult Index() 
     { 
      ViewBag.Message = "hello world yo: " + bar.SayHi(); 

      return View(); 
     } 

} 

public interface IBar 
{ 
    string SayHi(); 
} 

public class Bar : IBar 
{ 
    public string SayHi() 
    { 
     return "Hello from BarImpl!"; 
    } 
} 

私はエラーを取得する:

System.NullReferenceException: Object reference not set to an instance of an object. 
public IController Create(RequestContext requestContext, Type controllerType) 
Line 98:   { 
Line 99:    return container.GetInstance(controllerType) as IController; 
Line 100:    
Line 101:  } 

私は何とか手動一人ひとりコントローラクラスを配線する必要がありますか?

私global.asax.csがあります

​​

そして、私の構造化されたマップ関連するクラスが:

public class StructuredMapDependencyResolver : IDependencyResolver 
    { 
     private IContainer container; 
     public StructuredMapDependencyResolver(IContainer container) 
     { 
      this.container = container; 
     } 

     public object GetService(Type serviceType) 
     { 
      if (serviceType.IsAbstract || serviceType.IsInterface) 
      { 
       return container.TryGetInstance(serviceType); 
      } 
      return container.GetInstance(serviceType); 
     } 

     public IEnumerable<object> GetServices(Type servicesType) 
     { 
      //return container.GetAllInstances(servicesType) as IEnumerable<object>; 
      return container.GetAllInstances<object>() 

      .Where(s => s.GetType() == servicesType); 
     } 

    } 

    public class StructureMapControllerActivator : IControllerActivator 
    { 
     private IContainer container; 
     public StructureMapControllerActivator(IContainer container) 
     { 
      container = container; 
     } 


     public IController Create(RequestContext requestContext, Type controllerType) 
     { 
      return container.GetInstance(controllerType) as IController; 

     } 
    } 
+1

どのオブジェクトが 'NullReferenceException'の原因ですか? –

+0

良い質問、それはコンテナがnullであるようです!私はglobal.asax.cs Application_Startメソッドにブレークポイントを設定していますが、StrucureMapControllerActivatorが最初に呼び出されているようです。そんなことがあるものか? – Blankman

+1

ああ、問題は:container = containerはthis.container = containerだったはずです!私は結局、プライベートバールに_をつけるべきだと思う! – Blankman

答えて

2

は、あなたはあなたのNullReferenceExceptionを与えているオブジェクトがチェックしましたか?

あなたはここでそれ自体にcontainerを割り当てているように見えます:

private IContainer container; 
public StructureMapControllerActivator(IContainer container) 
{ 
    container = container; 
} 

だから、メンバ変数が設定されることはありません。コンストラクタ内の行をthis.container = containerに変更すると、うまくいくでしょう。

関連する問題