StructureMap:如何正确设置默认依赖项

时间:2011-07-21 12:34:40

标签: structuremap

我们最近采用的一种方法是在我们的每个程序集中包含一个StructureMap注册表,它设置了默认的依赖项。

我们使用扫描仪执行此操作:

        cfg.Scan(scanner =>
        {
            scanner.TheCallingAssembly();
            scanner.Assembly("Assembly1");
            scanner.Assembly("Assembly2");
            scanner.Assembly("Assembly3");

            scanner.LookForRegistries();
        });

我们的想法是,我们可以覆盖来自主应用程序的默认依赖项。

问题是,我们应该在哪里注册这些覆盖?即在我们扫描之前?,在我们扫描之后?

此外,扫描表达式中指定的程序集的顺序是否会影响依赖项的注册顺序。那么在上面的例子中,主应用程序(TheCallingAssembly)中包含的注册表是否会被“Assembly3”中的注册表覆盖?

非常感谢 本

1 个答案:

答案 0 :(得分:4)

TheCallingAssembly中的注册表将被您在Assembly1,2等中注册的注册表覆盖。

因此,如果您在每个程序集中注册ISomeInterface,那么Assembly3中的那个将是默认值。您可以通过调用

从结构图中获取的其他程序集中注册的那些
container.GetAllInstances<ISomeInterface>();

这将返回结构图中所有已注册的ISomeInterface的IList。

如果要覆盖通过扫描获得的那些,则必须由于某种原因再次配置容器。如果不这样做,则最后扫描的类型是默认类型。

在此示例中,在Assembly1中注册的ISomeInterface是默认值。当您查看代码时,人们会相信SomeOtherClass是默认代码。但它实际上是在Assembly1中注册的默认值。

var container = new Container(x => {
            x.Scan(scanner =>
            {
                scanner.TheCallingAssembly();
                scanner.Assembly("Assembly1");

                scanner.LookForRegistries();
            });

            x.For<ISomeInterface>().Use<SomeOtherClass>();
        });

从而覆盖扫描组件的映射。您必须像此示例一样再次配置容器。这里SomeOtherClass是ISomeInterface的默认值。

var container = new Container(x => {
            x.Scan(scanner =>
            {
                scanner.TheCallingAssembly();
                scanner.Assembly("Assembly1");

                scanner.LookForRegistries();
            });
        });

container.Configure(x => x.For<ISomeInterface>().Use<SomeOtherClass>());