7

我正在尝试Dependency injection在我的 MVC 应用程序中实现。我正在使用Unity.Mvc3.dllIoC。我只是想知道 Unity 如何无法从另一个程序集中注册类型。这是代码:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);

    var container = new UnityContainer();

    // ok: register type from this assembly
    container.RegisterType<IMessages, Messages>();

    // fail: register type from another assembly (service reference)
    container.RegisterType<IPlayerService, PlayerService>();

    DependencyResolver.SetResolver(new UnityDependencyResolver(container));
}

public class UnityDependencyResolver : IDependencyResolver
{
    private readonly IUnityContainer _container;

    public UnityDependencyResolver(IUnityContainer container)
    {
        this._container = container;
    }

    public object GetService(Type serviceType)
    {
        try
        {
            return _container.Resolve(serviceType);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        try
        {
            return _container.ResolveAll(serviceType);
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }
}

MVC 控制器中的用法:

[Dependency]
public IPlayerService PlayerService { get; set; }

[Dependency]
public IMessages Messages { get; set; }


public ActionResult Index()
{
    PlayerMessageViewModel vm = new PlayerMessageViewModel();
    vm.Messages = Messages; // success!
    vm.Players = PlayerService.Get(); // fail: null reference exception :PlayerService

    return View(vm);
}

PlayerService消息正常时始终为空。

这是PlayerService课程

public class PlayerService : IPlayerService
{
    private readonly MyDbEntities _dbContext;

    public PlayerService()
    {
        _dbContext = new MyDbEntities();
    }

    public PlayerService(MyDbEntities dbContext)
    {
        _dbContext = dbContext;
    }


    public IQueryable<Player> Get()
    {
        return _dbContext.Players.AsQueryable();
    }
}

这是完整的错误信息

依赖项解析失败,type = "System.Web.Mvc.IControllerFactory",name = "(none)"。
异常发生时:解决时。
异常是: InvalidOperationException - 当前类型 System.Web.Mvc.IControllerFactory 是一个接口,无法构造。您是否缺少类型映射?

4

4 回答 4

7

您正在隐藏所有异常并catch { return null; }尝试将其删除,并查看在解决时抛出了什么异常。我认为构造函数中抛出了异常PlayerService

编辑:

来自http://mvchosting.asphostcentral.com/post/ASPNET-MVC-3-Hosting-Problem-in-implementing-IControllerActivator-in-ASPNET-MVC-3.aspx

当一个 MVC 应用程序第一次启动时,依赖解析器会按以下顺序调用以下类型:

  • 控制器工厂
  • 控制器激活器
  • 家庭控制器

如果您没有实现解析器以在未注册类型时返回 null,那么您最终可能会看到类似于以下内容的错误:

当前类型 System.Web.Mvc.IControllerFactory 是接口,无法构造

于 2012-06-12T06:28:16.550 回答
7

默认情况下,统一选择具有最多参数的构造函数,所以我认为它将尝试使用第二个构造函数和 dbContext 参数,它无法解析。如果您使用属性 [InjectionConstructor] 标记默认构造函数,那么希望这将解决您的问题

于 2012-06-12T08:12:21.427 回答
2

你违反了 的合同IDependencyResolver。它应该返回null无法解析的类型。Unity 的问题在于它试图构建它可以找到的所有类,无论它们是否在容器中注册。

因此无法在某处建立一个类。

Unity.Mvc3nuget中还有一个可用的软件包。

于 2012-06-12T08:17:55.077 回答
0

当前类型(EX-DI.IBLL.IEmployee)是一个接口,无法构造。您是否缺少类型映射?

Ans -只需Unity.config.cs添加以下内容

public static class UnityConfig
    {
        public static void RegisterComponents()
        {
            var container = new UnityContainer();

            // register all your components with the container here
            // it is NOT necessary to register your controllers

            **container.RegisterType<IEmployee,EmployeeManager>();**
//this could be your interface and the class implementing the interface.

            DependencyResolver.SetResolver(new UnityDependencyResolver(container));
        }
    }
于 2016-01-25T12:14:01.000 回答