1

我有一个使用 StructureMap IoC 容器的控制台演示应用程序。该演示将所有接口和实现都放在一个项目中的一个文件中,扫描注册表如下所示:

public class ConsoleRegistry : Registry
{
    public ConsoleRegistry()
    {
        Scan(scan =>
        {
            scan.TheCallingAssembly();
            scan.WithDefaultConventions();
        });
    }
}

该演示使用约定ISomethingSomething因此 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 将为我找到我所有的接口和实现,而无需指定它们。

4

1 回答 1

0

你只是在扫描TheCallingAssembly。当您的应用程序运行时,调用程序集就是您的应用程序。当测试运行程序运行时,调用程序集就是测试运行程序。

为了使其可靠,您应该手动指定每个程序集:

Scan(scan =>
{
    scan.Assembly(typeof(SomeTypeFromAssembly1).Assembly);
    scan.Assembly(typeof(SomeTypeFromAssembly2).Assembly);
    scan.WithDefaultConventions();
 });

或者您应该使用扫描文档中的其他方法之一按目录名称指定程序集。

于 2018-03-11T10:27:59.333 回答