C# 如何将动态参数与autofac';s RegisterGeneric()方法?
当前情况 我正在一个接一个地注册一些课程,所有课程都采用以下模式:C# 如何将动态参数与autofac';s RegisterGeneric()方法?,c#,asp.net,asp.net-mvc,autofac,C#,Asp.net,Asp.net Mvc,Autofac,当前情况 我正在一个接一个地注册一些课程,所有课程都采用以下模式: builder.RegisterType<NpgsqlDapperRepository<Foo, int>>() .As<IDapperRepository<Foo, int>>() .WithParameter(new NamedParameter("connectionString", ConnectionStri
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();
显然,这就是为什么我不需要注册100个实体,它们基本上具有完全相同的配置,只有1个参数不同
问题
我需要根据实体类型确定表名。使用RegisterGeneric()
时如何获取类型?这可能吗
额外注意事项
我注意到一个叫做
ResolvedParameter
的东西,并对此进行了研究,但我不确定它是否是我所需要的。我不这么认为。但是,如果这确实是我所需要的,我希望能为我的情况举个例子。您可以创建自己的参数
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;
}
}
public类tablename参数:参数
{
公共重写布尔值CanSupplyValue(
ParameterInfo pi,IComponentContext,out Func valueProvider)
{
valueProvider=null;
if(pi.ParameterType!=typeof(String)&&pi.Name!=“tableName”)
返回false;
valueProvider=()=>
{
ITableNameResolver tableNameResolver=context.Resolve();
类型entityType=pi.Member.DeclaringType.GetGenericArguments()[0];
String tableName=tableNameResolver.GetTableName(entityType);
返回表名;
};
返回true;
}
}
您可以创建自己的参数
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;
}
}
public类tablename参数:参数
{
公共重写布尔值CanSupplyValue(
ParameterInfo pi,IComponentContext,out Func valueProvider)
{
valueProvider=null;
if(pi.ParameterType!=typeof(String)&&pi.Name!=“tableName”)
返回false;
valueProvider=()=>
{
ITableNameResolver tableNameResolver=context.Resolve();
类型entityType=pi.Member.DeclaringType.GetGenericArguments()[0];
String tableName=tableNameResolver.GetTableName(entityType);
返回表名;
};
返回true;
}
}
查看log4net
记录器解析代码,它似乎与您想要的类似。看看你是否能适应你的使用。。。看看log4net
logger解析代码,它似乎与您想要的类似。看看你是否能适应你的使用。。。完美的非常感谢。完美的非常感谢。