统一:无法从不同的程序集注册类型

本文关键字:程序集 注册 类型 统一 | 更新日期: 2023-09-27 18:37:02

我正在尝试在我的MVC应用程序中实现Dependency injection。我正在使用Unity.Mvc3.dll进行 IoC。我只是想知道 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();
    }
}

这是完整的错误消息

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

统一:无法从不同的程序集注册类型

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

您正在隐藏所有异常catch { return null; }尝试删除它并查看在解析时抛出的异常。我认为构造函数PlayerService抛出了异常。

编辑:

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

当 MVC 应用程序首次启动时,依赖项按以下顺序使用以下类型调用解析程序:

  • IControllerFactory
  • 主计生剂
  • 首页控制器

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

当前类型System.Web.Mvc.IControllerFactory是一个接口并且无法构造

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

因此,无法在某处构建类。

nuget 中还有一个Unity.Mvc3包。

当前类型 (EX-DI.伊伯尔。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));
        }
    }