2012-04-10 35 views
0

我使用StructureMap爲DI時遇到有不正確實例我MVC3自定義的基本控制器的問題。而不是傳遞一個IAuctionCmsServices的實例,我得到空。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代碼:

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>(); 
    } 
} 

在的global.asax.cs:

DependencyResolver.SetResolver(new StructureMapContainer(container)); 

當調用BaseController的構造函數中,IAuctionCmsServices參數爲null。如果我從構造函數中刪除這個(null),我仍然會得到null。

也許我BaseController的paramterless構造函數沒有正確寫的?如果我手動爲IAuctionCmsServices解決問題,則可以使用。這意味着IAuctionCmsServices已正確註冊但未被注入。

+1

我知道這可能不是一個有用的評論,但爲什麼不是NinJect? – Joe 2012-04-10 18:55:56

+0

你是對的,沒有幫助。我不認爲容器是這裏的問題。 – rboarman 2012-04-10 19:14:26

回答

0

你離開了從樣本構造的HomeController還是你想擁有呢?

我不是真正熟悉StructureMap,所以,除非它確實有些巫術與IL,如何應該的屬性被注入到HomeController的,如果它沒有接受它的構造函數?

IE

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

道歉,如果我是在密集或缺少的東西。

+0

HomeController從BaseController繼承。我想使用一個定製的基本控制器,所以我不必在衆多的控制器中傳播相同的構造器代碼。 – rboarman 2012-04-10 19:43:58

+0

同樣,除非StructureMap具有im不知道的IL編織功能,否則如果沒有派生類將使用基類中的參數化構造函數,則沒有意義。如果派生類上的構造函數不調用基類上的構造函數,那麼不可能調用基構造函數。 E.G如果您刪除了BaseController上的無參數構造函數,那麼您的代碼將無法編譯。 你將不得不使用屬性注入而不是構造函數注入來獲得你想要的結果。 – 2012-04-10 19:48:51

+0

我剛剛達到同樣的判斷。謝謝。 – rboarman 2012-04-10 19:51:13