c# - DependencyResolver 不解析依赖关系。为什么?

标签 c# dependency-injection inversion-of-control unity-container

我在项目中使用 Unity 作为我的 IoC。

UnityConfig是这样设置的...

public static class UnityConfig
{
    private static readonly IUnityContainer container = new UnityContainer();

    public static void ConfigureIoCContainer()
    {
        My.Composition.Builder.Compose(container);

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

    /// <summary>
    /// Gets the configured Unity container.
    /// </summary>
    public static IUnityContainer GetConfiguredContainer()
    {
        return container;
    }
}

My.Composition.Builder.Compose() 执行此操作...

    public static void Compose(IUnityContainer container)
    {
        var types = new List<Type>();

        types.AddRange(Services.Interface.Builder.GetTypes(container));
        types.AddRange(Services.Builder.GetTypes(container));            
        // ... lots more assemblies referenced here

        var distinctTypes = types.Distinct();

        container.RegisterTypes(distinctTypes, WithMappings.FromMatchingInterface, WithName.Default, WithLifetime.PerResolve);
    }

现在,在上面引用的 2 个程序集中,我返回 3 种类型;从第一个开始的 IConfigUowISecurityUowIResourceUow 以及 ConfigUowSecurityUowResourceUow 从第二个开始。

如果我在 UnityConfig 中调用 My.Composition.Builder.Compose(container) 之后的行放置一个断点,并查看注册类型的列表,我可以看到我应该看到的所有内容...

{Microsoft.Practices.Unity.ContainerRegistration}
    LifetimeManager: {Microsoft.Practices.Unity.PerResolveLifetimeManager}
    LifetimeManagerType: {Name = "PerResolveLifetimeManager" FullName = "Microsoft.Practices.Unity.PerResolveLifetimeManager"}
    MappedToType: {Name = "ConfigUow" FullName = "My.Services.Security.ConfigUow"}
    Name: null
    RegisteredType: {Name = "IConfigUow" FullName = "My.Services.Interface.Security.IConfigUow"}

{Microsoft.Practices.Unity.ContainerRegistration}
    LifetimeManager: {Microsoft.Practices.Unity.PerResolveLifetimeManager}
    LifetimeManagerType: {Name = "PerResolveLifetimeManager" FullName = "Microsoft.Practices.Unity.PerResolveLifetimeManager"}
    MappedToType: {Name = "SecurityUow" FullName = "My.Services.Security.SecurityUow"}
    Name: null
    RegisteredType: {Name = "ISecurityUow" FullName = "My.Services.Interface.Security.ISecurityUow"}

{Microsoft.Practices.Unity.ContainerRegistration}
    LifetimeManager: {Microsoft.Practices.Unity.PerResolveLifetimeManager}
    LifetimeManagerType: {Name = "PerResolveLifetimeManager" FullName = "Microsoft.Practices.Unity.PerResolveLifetimeManager"}
    MappedToType: {Name = "ResourceUow" FullName = "My.Services.Localization.ResourceUow"}
    Name: null
    RegisteredType: {Name = "IResourceUow" FullName = "My.Services.Interface.Localization.IResourceUow"}

但是,如果我让下一行执行来设置 DependencyResolver 并调用

DependencyResolver.Current.GetService<IConfigUow>();

返回值null。调用

DependencyResolver.Current.GetService<ISecurityUow>();

工作并返回SecurityUow的实例。尝试解析 IResourceUow 也失败。

在我的一生中,我看不出我做错了什么。大家有什么想法吗?

更新

好的,通过调用 container.Resolve(IConfigUow) 我得到了一个被 DependencyResolver 屏蔽的异常。

该错误表明我缺少类型映射。 ConfigUow 的构造函数如下所示...

    public ConfigUow(ICrudRepo<AM.Configuration> crudRepo = null) : base(crudRepo)
    {
        CrudRepo = crudRepo ?? DependencyResolver.Current.GetService<IConfigRepo>();
        Ctx = CrudRepo.GetContext();
    }

我不知道我需要为使用泛型的类型显式调用 RegisterType()

所以,我需要做的就是像这样注册适当的类型......

container.RegisterType(typeof (ICrudRepo<>), typeof (CrudRepo<>)); 

一切都成功了。

对于 future 的读者来说,这些页面被证明很有帮助......

最佳答案

答案是 DependencyResolver 掩盖了 IoC 容器抛出异常的事实。

发现解决这个问题并不难。请读者查看原始问题的更新,看看我必须修复什么以及我是如何做到的。

关于c# - DependencyResolver 不解析依赖关系。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34611822/

相关文章:

c# - 将 int 转换为 short 会产生意想不到的结果

dependency-injection - DI : Composition root decomposition

asp.net-mvc - 您可以使用 IOC 容器将依赖项注入(inject)自定义 WebViewPage 的构造函数吗?

c# - 部署 ASP.NET Web 应用程序

c# - 如何在计时器启动后防止 Tick 事件

c# - 使用正则表达式从字符串中提取多个值

java - @Cacheable 打破 DependencyInjection

java - 构造函数中的依赖注入(inject)

javascript - Angular http 发布错误 : Cannot read property 'post' of undefined

inversion-of-control - 什么是控制反转 (IoC)?