我们最近采用的一种方法是在我们的每个程序集中包含一个StructureMap注册表,它设置了默认的依赖项。
我们使用扫描仪执行此操作:
cfg.Scan(scanner =>
{
scanner.TheCallingAssembly();
scanner.Assembly("Assembly1");
scanner.Assembly("Assembly2");
scanner.Assembly("Assembly3");
scanner.LookForRegistries();
});
我们的想法是,我们可以覆盖来自主应用程序的默认依赖项。
问题是,我们应该在哪里注册这些覆盖?即在我们扫描之前?,在我们扫描之后?
此外,扫描表达式中指定的程序集的顺序是否会影响依赖项的注册顺序。那么在上面的例子中,主应用程序(TheCallingAssembly)中包含的注册表是否会被“Assembly3”中的注册表覆盖?
非常感谢 本
答案 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>());