В текущем приложении, над которым я работаю, у меня есть собственный класс ControllerFactory, который создает контроллер и автоматически устанавливает Elmah ErrorHandler.
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 для добавления кода в мои контроллеры. Например, я хотел бы автоматически добавлять в них классы репозитория.
Я уже создал свои классы репозитория, а также добавил конструктор в контроллер, который получает класс репозитория
public FirmController( IContactRepository contactRepository ) {
_contactRepository = contactRepository;
}
Затем я зарегистрировал тип в StructureMap
ObjectFactory.Initialize( x => {
x.For<IContactRepository>().Use<MyContactRepository>();
});
Как мне изменить код в методе CreateController, чтобы конкретный класс IContactRepository
вводился в FirmController
?
EDIT
Я изменил BaseControllerFactory для использования Structuremap. Но я получаю исключение на линии
return (Controller)ObjectFactory.GetInstance( controllerType );
Есть подсказка?