StructureMap DI不会从nuget包中注册实现

时间:2018-07-12 14:28:32

标签: c# asp.net-core dependency-injection visual-studio-2017 structuremap

在过去两天的大部分时间里,我一直试图理解这个问题, 似乎在使用nuget程序包时,该程序将.net核心程序包与
一个StructurMap注册表,注册表中的内容永远不会进入应用程序的容器。这是nuget包的代码:

public class SomeRegistry : Registry
{
    public SomeRegistry()
    {
        this.For<ILogger>().Use<Logger>();
    }
}

这是注册表的启动查找:

 public virtual void ConfigureContainer(Registry registry)
    {


        registry.Scan(
            c =>
            {
                c.AssembliesFromApplicationBaseDirectory();
                c.LookForRegistries();
            });

        //this is just for testing 
        var con = new Container(registry);
        con.GetInstance<SomeDLL.ILogger>();//this will fail with "No default Instance is registered and cannot be automatically determined for type" 
    }

我使用.net核心traget框架2.1

structureMap.AspNetCore 1.4.0

Visual Studio 2017

感谢您的帮助

1 个答案:

答案 0 :(得分:1)

问题解决了,看来

 c.AssembliesFromApplicationBaseDirectory();

仅扫描应用程序文件夹(如建议的名称),但在.net核心上是nuget 软件包不会复制到应用程序文件夹(它们已从缓存文件夹加载到内存中)

解决方案是让程序集成为我们自己,并将它们加载到程序集扫描器中,如下所示:

var assemblies = AppDomain.CurrentDomain.GetAssemblies().Where(assembly => assembly.GetTypes()
            .Any(t => t != typeof(Registry) && typeof(Registry).IsAssignableFrom(t))).ToList();

        registry.Scan(
            c =>
            {
                assemblies.ForEach(a => c.Assembly(a));
                c.LookForRegistries();
            });