StructureMap DI 不从 nuget 包注册实现
StructureMap DI does not register implementations from nuget package
在过去两天的大部分时间里,我一直在努力理解这个问题,
似乎在使用带有
的 .net 核心包的 nuget 包时
一个 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 核心目标框架 2.1
structureMap.AspNetCore 1.4.0
visual studio 2017
感谢帮助
很好,问题解决了,看来
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();
});
在过去两天的大部分时间里,我一直在努力理解这个问题,
似乎在使用带有
的 .net 核心包的 nuget 包时
一个 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 核心目标框架 2.1
structureMap.AspNetCore 1.4.0
visual studio 2017
感谢帮助
很好,问题解决了,看来
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();
});