2012-04-10 74 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