Asp.Net MVC Unity依赖注入在尝试解析控制器时会出现异常

时间:2014-09-15 19:10:51

标签: c# asp.net-mvc nhibernate dependency-injection unity-container

我第一次尝试实施依赖注入。我基于公司的其他工作项目和网络内容。

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

以下是我在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
}

这是异常正文(full text here):

  

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

     

其他信息:依赖项的解析失败,type =“Tasks.Controllers.TasksController”,name =“(none)”。

     

在解析时发生异常。

     

异常是:InvalidOperationException - 当前类型NHibernate.ISessionFactory是一个接口,无法构造。你错过了类型映射吗?

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

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

protected TaskService TaskService { get; set; }

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

为什么会这样?

1 个答案:

答案 0 :(得分:0)

有一个名为&#34的NuGet包;用于ASP.NET MVC的Unity引导程序"专门针对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是实际的实现