StructureMap:如何根据约定将不同的命名实例注入构造函数

时间:2014-02-15 15:18:48

标签: .net inversion-of-control structuremap

我有以下很多类型:

public class XDatabase : INHibernateDatabase
{
   public XDatabase(DatabaseConfiguration) { ... }
}
// etc... 

我正在设置StructureMap:

var container = new Container(x =>
    {
        x.Scan(scanner =>
                {
                    scanner.Assembly("Model.Persistence");
                    scanner.AddAllTypesOf<INHibernateDatabase>();
                });

        // The following will be generated from the app.config ConnectionStrings
        x.For<DatabaseConfiguration>()
               .Add(new DatabaseConfiguration("something"))
               .Named("XDatabase");
        // etc....
    });

container.GetAllInstances<INHibernateDatabase>();

显然这不起作用,因为我有多个实例(并且没有默认值)用于DatabaseConfiguration,而StructureMap不知道选择哪个INHibernateDatabase实例。

如何告诉StructureMap使用约定,以便它总是根据命名约定选择DatabaseConnnection实例?

1 个答案:

答案 0 :(得分:1)

我最终使用自定义IRegistrationConvention

执行此操作
public class DatabaseRegistrationConvention : IRegistrationConvention
{
    public void Process(Type type, Registry registry)
    {
        if (type.CanBeCastTo<INHibernateDatabase>() && type.HasConstructors())
        {
            // In reality I get the database name via metadata
            var dbName = "databaseNameIDeterminedSomehow";

            // Outside this convention I will have procedurally add a bunch of named DatabaseConfigurations
            var configuredInstance = registry
                .For(typeof (ISchemaDeployer))
                .Use(type)
                .Ctor<DatabaseConfiguration>().IsNamedInstance(dbName);
        }
    }
}