我们最近采取的一种方法是在设置默认依赖项的每个程序集中包括一个StructureMap注册表。
我们使用扫描仪来实现这一点:
cfg.Scan(scanner =>
{
scanner.TheCallingAssembly();
scanner.Assembly("Assembly1");
scanner.Assembly("Assembly2");
scanner.Assembly("Assembly3");
scanner.LookForRegistries();
});这样我们就可以通过覆盖主应用程序中的默认依赖项。
问题是,我们应该在哪里登记这些越权?也就是说,在我们扫描之前?,我们扫描之后?
此外,扫描表达式中指定的程序集的顺序是否会影响到注册依赖项的顺序。因此,在上面的示例中,主应用程序(TheCallingAssembly)中包含的注册中心是否会被"Assembly3“中的注册中心覆盖?
非常感谢
本
发布于 2011-08-14 01:26:45
TheCallingAssembly中的注册中心将被在Assembly1、2等中注册的注册中心覆盖。
因此,如果您在所有这些程序集中注册ISomeInterface,Assembly3中的一个将是默认的。在其他程序集中注册的程序集,可以通过调用
container.GetAllInstances<ISomeInterface>();这将返回结构图中所有已注册ISomeInterface的ISomeInterface。
如果您想要覆盖您通过扫描得到的,您必须再次配置容器,因为某些原因。如果不这样做,最后一次扫描类型是默认的。
在本例中,在ISomeInterface中注册的Assembly1是默认的。当您查看代码时,人们会相信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>());https://stackoverflow.com/questions/6776128
复制相似问题