我有一个使用 StructureMap IoC 容器的控制台演示应用程序。该演示将所有接口和实现都放在一个项目中的一个文件中,扫描注册表如下所示:
public class ConsoleRegistry : Registry
{
public ConsoleRegistry()
{
Scan(scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
});
}
}
该演示使用约定ISomething
,Something
因此 StructureMap 可以自动找到接口的实现。
现在,当我把它移到一个有UI 项目和业务项目的真实项目时。我保持惯例,ISomething
但是Something
当我尝试在我的单元测试项目中运行集成测试时收到以下错误消息。
消息:测试方法 AbcCompany.Tests.IntegrationTestsForTasks.Get_something_test 抛出异常:StructureMap.StructureMapConfigurationException:未注册默认实例,无法自动确定类型“AbcCompany.DomainLayer.ISomething”
没有为 AbcCompany.DomainLayer.ISomething 1.) Container.GetInstance() 指定配置
如果我将注册表更改为以下内容,它将起作用:
class ScanningRegistry : Registry
{
public ScanningRegistry()
{
this.For<ISomething>().Use<Something>();
this.Policies.SetAllProperties(y => y.WithAnyTypeFromNamespaceContainingType<Something>());
}
}
但是,如果我保持标准命名约定,我喜欢这样,StructureMap 将为我找到我所有的接口和实现,而无需指定它们。