私は現在作業中です。コントローラを作成し、自動的にElmah ErrorHandlerを設定するカスタムControllerFactoryクラスがあります。StructureMapを使用してコントローラにリポジトリクラスを注入する方法は?
public class BaseControllerFactory : DefaultControllerFactory
{
public override IController CreateController(RequestContext requestContext, string controllerName) {
var controller = base.CreateController(requestContext, controllerName);
var c = controller as Controller;
if (c != null) {
c.ActionInvoker = new ErrorHandlingActionInvoker(new HandleErrorWithElmahAttribute());
}
return controller;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType) {
try {
if ((requestContext == null) || (controllerType == null))
return base.GetControllerInstance(requestContext, controllerType);
return (Controller)ObjectFactory.GetInstance(controllerType);
}
catch (StructureMapException) {
System.Diagnostics.Debug.WriteLine(ObjectFactory.WhatDoIHave());
throw new Exception(ObjectFactory.WhatDoIHave());
}
}
}
私は自分のコントローラにいくつかのコードを挿入するためにStructureMapを使いたいと思っています。たとえば、リポジトリクラスを自動的に挿入したいと思います。どのようにすべきである私は、その後のStructureMap
内ObjectFactory.Initialize(x => {
x.For<IContactRepository>().Use<MyContactRepository>();
});
をタイプを登録している
は、私はすでに私のリポジトリのクラスを作成しているとも私は
public FirmController(IContactRepository contactRepository) {
_contactRepository = contactRepository;
}
リポジトリクラスを受けるコントローラにコンストラクタを追加しました私はFirmController
に注入された具体的なクラスIContactRepository
を持つようにCreateControllerメソッドのコードを変更しますか?
EDIT:
私はのStructureMapを使用するようにBaseControllerFactoryを変更しました。しかし、私はラインで例外を得る
return (Controller)ObjectFactory.GetInstance(controllerType);
すべてのヒント?
あなたは何を得ていますか?カスタムコントローラファクトリを設定する前に、app_startでInitializeコードを呼び出していますか? I. StaticClass.InitializeStructureMap();次に、ControllerBuilder.Current.SetControllerFactory(新しいBaseControllerFactory()); – Paul
良いキャッチ。私は、カスタムコントローラファクトリを設定した後、初期化コードを呼び出していました。 – Lorenzo