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は正しく登録されていますが、注入されていません。
これは役に立つコメントではないかもしれませんが、なぜNinJectではないのですか? – Joe
あなたは正しいとは言えません。私はコンテナがここで問題ではないと思う。 – rboarman