[英]How do I use dynamic parameters with autofac's RegisterGeneric() method?
现在的情况
我正在用以下模式一对一注册一些类:
builder.RegisterType<NpgsqlDapperRepository<Foo, int>>()
.As<IDapperRepository<Foo, int>>()
.WithParameter(new NamedParameter("connectionString", ConnectionString))
.WithParameter(new NamedParameter("tableName", "Foos"))
.WithParameter(new NamedParameter("schema", "dbo"))
.InstancePerLifetimeScope();
我正在尝试
我想按如下方式使用RegisterGeneric()
:
builder.RegisterGeneric(typeof(NpgsqlDapperRepository<,>))
.As(typeof(IDapperRepository<,>))
.WithParameter(new NamedParameter("connectionString", ConnectionString))
.WithParameter(new NamedParameter("tableName", ???)) //TODO: Determine table name from entity type (acquire from dictionary or something). How do I acquire the type?
.WithParameter(new NamedParameter("schema", "dbo"))
.InstancePerLifetimeScope();
显然,这样一来,我不需要注册100个实质上具有完全相同配置的实体,只是其中一个参数不同。
问题
我需要从实体类型确定表名称。 使用RegisterGeneric()
时如何获取类型? 这有可能吗?
额外注意
我注意到一个叫做ResolvedParameter
东西并进行了调查,但是我不确定这是否是我所需要的。 我没想 但是,如果确实是我所需要的,我将为我的情况提供一个例子。
您可以创建自己的Parameter
public class TableNameParameter : Parameter
{
public override Boolean CanSupplyValue(
ParameterInfo pi, IComponentContext context, out Func<Object> valueProvider)
{
valueProvider = null;
if (pi.ParameterType != typeof(String) && pi.Name != "tableName")
return false;
valueProvider = () =>
{
ITableNameResolver tableNameResolver = context.Resolve<ITableNameResolver>();
Type entityType = pi.Member.DeclaringType.GetGenericArguments()[0];
String tableName = tableNameResolver.GetTableName(entityType);
return tableName;
};
return true;
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.