如何在 autofac 的 RegisterGeneric() 方法中使用动态参数?
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 个实体,它们基本上具有完全相同的配置,只有 1 个参数不同。
问题
我需要根据实体类型确定 table 名称。使用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;
}
}
现状
我正在逐一注册一些 类,全部采用以下模式:
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 个实体,它们基本上具有完全相同的配置,只有 1 个参数不同。
问题
我需要根据实体类型确定 table 名称。使用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;
}
}