Dependency injection 我可以在StructureMap中使用约定和实例名称吗?

Dependency injection 我可以在StructureMap中使用约定和实例名称吗?,dependency-injection,structuremap,Dependency Injection,Structuremap,在引导StructureMap时,我总是使用默认实例(与命名实例相反),并且能够定义一个简单的约定,通过程序集扫描来连接实例。在不深入公约本身细节的情况下,我会这样引导: assemblies.ForEach(a => x.Scan(y => { y.Assembly(a); y.WithDefaultConventions(); y.Convention<DomainInterfaceNamingConventi

在引导StructureMap时,我总是使用默认实例(与命名实例相反),并且能够定义一个简单的约定,通过程序集扫描来连接实例。在不深入公约本身细节的情况下,我会这样引导:

assemblies.ForEach(a =>
    x.Scan(y =>
    {
        y.Assembly(a);
        y.WithDefaultConventions();
        y.Convention<DomainInterfaceNamingConvention>();
    }));
x.For<Logger>().Use(l => new Log4Net.LoggerImplementation());
x.For<Logger>().Add(l => new Log4Net.LoggerImplementation()).Named("Log4Net");
x.For<Logger>().Add(l => new NLog.LoggerImplementation()).Named("NLog");
因此,定义了一个默认值,并添加了一些命名实例,以防代码专门请求一个实例

但是,我怎样才能将两者结合起来呢?在我的示例中,命名实例的配置是每个类,而在我的示例中,基于约定的实例的配置是每个程序集。我的一些程序集中有很多类,在这个特定场景中,这些类可以非常频繁地出现和消失。因此,需要手动连接每个类,而不仅仅是每个程序集,对于开发来说,这将是一个相当棘手的操作难题


在基于约定的扫描中,是否有一种在程序集级别使用名称的方法?因此,例如,对于一个程序集,我可能有大量名为“Database”的引导存储库实例,对于另一个程序集,我有大量名为“XML”的引导存储库实例,对于另一个程序集,我有大量名为“Mock”的引导存储库实例,而不必指定每个单独的存储库(三次,如果计算默认值,则为四次)在bootstrapper?

中,我使用了一点反射来实现这一点。不管怎样,我的程序集名称都遵循相似的模式。例如,我可能有三个实现DAL接口的程序集:

  • Acme.Infrastructure.DAL.SQLExpress
  • Acme.Infrastructure.DAL.xml文件
  • Acme.Infrastructure.DAL.Mock
这里的最终目标是,在程序集级别,我可以相应地配置命名实例。所以我可以这样做:

var fooRepository = IoCFactory.GetInstance<FooRepository>("SQLExpress");
var barRepository = IoCFactory.GetInstance<BarRepository>("XMLFiles");
然后,在其他一些逻辑中,将其添加到对象图:

registry.For(interfaceType).Use(type).Named(implementationName);

我最后用了一点思考来实现这一点。不管怎样,我的程序集名称都遵循相似的模式。例如,我可能有三个实现DAL接口的程序集:

  • Acme.Infrastructure.DAL.SQLExpress
  • Acme.Infrastructure.DAL.xml文件
  • Acme.Infrastructure.DAL.Mock
这里的最终目标是,在程序集级别,我可以相应地配置命名实例。所以我可以这样做:

var fooRepository = IoCFactory.GetInstance<FooRepository>("SQLExpress");
var barRepository = IoCFactory.GetInstance<BarRepository>("XMLFiles");
然后,在其他一些逻辑中,将其添加到对象图:

registry.For(interfaceType).Use(type).Named(implementationName);