当试图解析控制器时,Asp.NetMVCVUnity依赖注入会产生异常

本文关键字:注入 依赖 NetMVCVUnity 异常 Asp 控制器 | 更新日期: 2023-09-27 18:22:00

我第一次尝试实现depency注入。我的基础是我公司的其他工作项目和网络内容。

我遇到了一个解析器试图解析控制器类型的情况。我没有注册任何控制器类型(也没有看到类似的东西),所以我很困惑。

这是我在Global.asax.cs:的注册

Container = new UnityContainer();
        
// repositories
foreach (var type in Assembly.GetAssembly(typeof(UserRepository))
                    .GetTypes()
                    .Where(x => x.IsClass && x.Name.EndsWith("Repository")))
{
    Container.RegisterType(type);
}
// services
foreach (var type in Assembly.GetAssembly(typeof (TaskService))
                    .GetTypes()
                    .Where(x => x.IsClass && x.Name.EndsWith("Service")))
{
    Container.RegisterType(type);
}
DependencyResolver.SetResolver(new UnityDependencyResolver(Container));

以下是发生异常的UnityDependencyResolver方法:

private readonly IUnityContainer _container;
public UnityDependencyResolver(IUnityContainer container)
{
    this._container = container;
}
public object GetService(Type serviceType)
{
    if (!_container.IsRegistered(serviceType))
    {
        if (serviceType.IsAbstract || serviceType.IsInterface)
        {
            return null;
        }
    }
    return _container.Resolve(serviceType); // Right on this line the exception occurs
}

这是异常正文(此处为全文):

Microsoft.Practices.Unity.dll中出现类型为"Microsoft.Practice.Unity.ResolutionFailedException"的异常,但未在用户代码中处理

附加信息:依赖项的解析失败,类型=";Tasks.Controllers.TasksController";,name=";(无)";。

解析时发生异常。

异常为:InvalidOperationException-当前类型NHibernate.ISessionFactory是一个接口,无法构造。您是否缺少类型映射?

正如您所看到的,当解析器获得要解决的TasksController类型(在serviceType中)并崩溃时,就会发生问题。

这是我的控制器的相关部分(这是项目中唯一的注入),如果有帮助的话:

protected TaskService TaskService { get; set; }
public TasksController(TaskService taskService)
{
    this.TaskService = taskService;
}

为什么会发生这种情况?

当试图解析控制器时,Asp.NetMVCVUnity依赖注入会产生异常

有一个名为"Unity bootstraper for ASP.NET MVC"的NuGet包专门针对ASP.NET MVC web应用程序,你尝试过吗?基本上,在安装它之后,只需在App_Start文件夹下注册您想要注入到UnityConfig.cs中的内容,就可以开始了。

例如:

public static void RegisterTypes(IUnityContainer container)
{
    // NOTE: To load from web.config uncomment the line below. Make sure to add a Microsoft.Practices.Unity.Configuration to the using statements.
    // container.LoadConfiguration();
    // TODO: Register your types here
    container.RegisterType<IAuthProvider, FormsAuthProvider>();
}

其中IAuthProvider是接口,FormsAuthProvider是实际实现