首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >StructureMap:如何正确设置默认依赖项

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

Stack Overflow用户
提问于 2011-07-21 12:34:40
回答 1查看 1.3K关注 0票数 2

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

我们使用扫描仪来实现这一点:

代码语言:javascript
复制
        cfg.Scan(scanner =>
        {
            scanner.TheCallingAssembly();
            scanner.Assembly("Assembly1");
            scanner.Assembly("Assembly2");
            scanner.Assembly("Assembly3");

            scanner.LookForRegistries();
        });

这样我们就可以通过覆盖主应用程序中的默认依赖项

问题是,我们应该在哪里登记这些越权?也就是说,在我们扫描之前?,我们扫描之后?

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

非常感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-14 01:26:45

TheCallingAssembly中的注册中心将被在Assembly1、2等中注册的注册中心覆盖。

因此,如果您在所有这些程序集中注册ISomeInterface,Assembly3中的一个将是默认的。在其他程序集中注册的程序集,可以通过调用

代码语言:javascript
复制
container.GetAllInstances<ISomeInterface>();

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

如果您想要覆盖您通过扫描得到的,您必须再次配置容器,因为某些原因。如果不这样做,最后一次扫描类型是默认的。

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

代码语言:javascript
复制
var container = new Container(x => {
            x.Scan(scanner =>
            {
                scanner.TheCallingAssembly();
                scanner.Assembly("Assembly1");

                scanner.LookForRegistries();
            });

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

因此,要重写扫描程序集中的映射,请执行以下操作。您必须像下面这样重新配置容器。这里,SomeOtherClass是ISomeInterface的缺省值。

代码语言:javascript
复制
var container = new Container(x => {
            x.Scan(scanner =>
            {
                scanner.TheCallingAssembly();
                scanner.Assembly("Assembly1");

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

container.Configure(x => x.For<ISomeInterface>().Use<SomeOtherClass>());
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6776128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档