Как использовать StructureMap для внедрения классов репозитория в контроллер? - PullRequest
1 голос
/ 16 января 2011

В текущем приложении, над которым я работаю, у меня есть собственный класс 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 );

Есть подсказка?

1 Ответ

5 голосов
/ 16 января 2011

Прежде чем вводить решение, я бы порекомендовал использовать тип Container для инициализации SM, а не ObjectFactory

. Лучший способ добиться этого - иметь подкласс класса из класса Registry в структуре StructureMap.поэтому мой реестр будет выглядеть примерно так:

public class MyAppRegistry : Registry
{
     public MyAppRegistry()
     {
        For<IContactRepository>().Use<MyContactRepository>();
     }
}

, а затем скажет SM использовать этот реестр во время настройки.

var container = new Container(x=>x.AddRegistry(new MyAppRegistry());

это будет сделано из Application_Start в Global.asax.После строки выше установите ControllerBuilder в mvc, чтобы использовать BaseControllerFactory.Теперь SM должен иметь возможность разрешать все зависимости

...