Инъекция зависимостей asp.net в единство не работает - PullRequest
0 голосов
/ 07 сентября 2011

Я использую инфраструктуру mvc 3 asp.net, я создал UnityControllerFactory, который реализует интерфейс IControllerFactory:

...
public class UnityControllerFactory : IControllerFactory
{
    private IUnityContainer _container;
    private IControllerFactory _innerFactory;

    public UnityControllerFactory(IUnityContainer container)
        : this(container, new DefaultControllerFactory())
    {
    }

    protected UnityControllerFactory(IUnityContainer container,
                                     IControllerFactory innerFactory)
    {
        _container = container;
        _innerFactory = innerFactory;
    }
public IController CreateController(RequestContext requestContext,
                                        string controllerName)
    {
        try
        {
            IController controller = _container.Resolve<IController>(controllerName.ToLowerInvariant);

            return controller;
        }
        catch (Exception ex)
        {
            var msg = ex.Message;
            return _innerFactory.CreateController(requestContext, controllerName);
        }

    }
...

и в Application_Start () у меня есть:

protected void Application_Start() {
        AreaRegistration.RegisterAllAreas();
        RegisterGlobalFilters(GlobalFilters.Filters);
        RegisterRoutes(RouteTable.Routes);


        IUnityContainer container = GetUnityContainer();
        container.RegisterType<IRepository<User>, LiveRepository<User>>();
        DependencyResolver.SetResolver(new UnityDependencyResolver(container));
        ControllerBuilder.Current.SetControllerFactory(new UnityControllerFactory(container));
        ...

    }

Я проверяю это с помощью домашнего контроллера

public class HomeController : Controller{
    IRepository<User> userRepo;
    public HomeController(IRepository<User> userRepo)
    {
         this.userRepo = userRepo;
    }
    ...
}

Когда я запускаю приложение, я вообще не могу собрать домашний контроллер. в строке:

IController controller = _container.Resolve<IController>(controllerName.ToLowerInvariant);

Я получаю исключение говорит:

** "Не удалось разрешить зависимость, type =" System.Web.Mvc.IController ", name = "HomeController". Исключение произошло во время: при разрешении.

Исключение: InvalidOperationException - Текущий тип, System.Web.Mvc.IController, является интерфейсом и не может быть создан. Вам не хватает отображения типов?

На момент исключения контейнер был: Resolving System.Web.Mvc.IController, homecontroller "**

, но даже с фабрикой контроллера по умолчанию, использующей строку:

_innerFactory.CreateController(requestContext, controllerName);

Я все еще не могу собрать контроллер, пожалуйста, помогите

1 Ответ

0 голосов
/ 07 сентября 2011

Я бы порекомендовал вам взглянуть на следующую запись в блоге , в которой показано, как использовать пользовательский DependencyResolver с Unity в приложении ASP.NET MVC 3.

...