这是使用基于约定的方法在Unity中注册类型的正确方法吗?

时间:2015-08-14 13:57:39

标签: c# asp.net-web-api unity-container

我按照惯例注册我的类型,但是我的其他程序集中的某些类型没有一致地注册。有时它们是注册的,而有时则不是。它不会一直失败。这是一些跟踪数据:

  

...是一个接口,无法构造。你错过了一个类型吗?   映射?

我想在注册过程中消除第三方dll等。这是正确的方法吗?

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

        container.RegisterTypes(
         AllClasses.FromLoadedAssemblies().Where(t => t.Namespace != null && t.Namespace.StartsWith("MY NAMESPACEs ONLY")),
         WithMappings.FromMatchingInterface,
         WithName.Default);

        GlobalConfiguration.Configuration.DependencyResolver = new UnityDependencyResolver(container);
    }
}

编辑:当我删除“Where”过滤器时,这也会随机发生。我之前使用过这种注册方法,但从未发生这种情况。发生了什么事?

1 个答案:

答案 0 :(得分:1)

我自己弄清楚这一点,并意识到AllClasses.FromLoadedAssemblies()没有按预期工作(它可能按预期工作,而不是我的预期)。 似乎是,因为它在不同的环境中以不同的顺序加载程序集。我无法找到解决方案,但我找到了解决方法。

我的解决方案是使用AllClasses.FromLoadedAssemblies()来避免BuildManager.GetReferencedAssemblies()

.RegisterTypes(
    AllClasses.FromAssemblies(
             BuildManager.GetReferencedAssemblies().Cast<Assembly>()),
    WithMappings.FromMatchingInterface,
    WithName.Default,
    overwriteExistingMappings: true); 

在这里看到解决它的原始问题: Unity registration fails after iisreset