我有以下很多类型:
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实例?
答案 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);
}
}
}