autofac - Autofac 参数从模型解析到存储库
问题描述
如何在 Autofac 容器注册期间将 Model: DatabaseName 中的参数设置为 MyRepository 构造函数?
这是代码示例:
public class ModelBase
{
public string DatabaseName;
}
public interface IRepository<TEntity>
where TEntity : ModelBase
{
}
public class MyRepository<TEntity> : IRepository<TEntity>
where TEntity : ModelBase
{
private readonly string _connectionString;
public MyRepository(string databaseName)
{
_connectionString = string.Format("DatabaseName='{0}';...", databaseName);
}
}
class Program
{
static void Main(string[] args)
{
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterGeneric(typeof(MyRepository<>)).As(typeof(IRepository<>));
IContainer container = containerBuilder.Build();
var someRepository = container.Resolve<IRepository<ModelBase>>();
}
}
解决方案
据我了解,您可以尝试DatabaseName
使用有点代码从存储库的通用参数中提取值:
public class ModelBase
{
public virtual string DatabaseName { get; } = "MyDataBase";
}
public class SubModelBase : ModelBase
{
public override string DatabaseName { get; } = "AnotherDataBase";
}
public interface IRepository<TEntity>
where TEntity : ModelBase
{
}
public class MyRepository<TEntity> : IRepository<TEntity>
where TEntity : ModelBase
{
private readonly string _connectionString;
public MyRepository(string databaseName)
{
_connectionString = string.Format("DatabaseName='{0}';...", databaseName);
}
}
class Program
{
static void Main(string[] args)
{
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterGeneric(typeof(MyRepository<>)).As(typeof(IRepository<>)).WithParameter((p, ctx) => true, (p, ctx) =>
{
var repType = p.Member.DeclaringType;
var genericParamType = repType.GenericTypeArguments[0];
var prop = genericParamType.GetProperty("DatabaseName");
var databaseName = prop.GetValue(Activator.CreateInstance(genericParamType));
// or for static DatabaseName
// var databaseName = prop.GetValue(null);
return databaseName;
});
IContainer container = containerBuilder.Build();
var someRepository = container.Resolve<IRepository<ModelBase>>();
var anotherRepository = container.Resolve<IRepository<SubModelBase>>();
}
}
请注意,DatabaseName
必须确定默认ModelBase
实例和类型必须具有无参数构造函数。或者您可以制作DatabaseName
静态并使其在编译时分配。在这种情况下,您可以调用var databaseName = prop.GetValue(null);
.
推荐阅读
- python-3.x - Drop by multiple columns groups if specific values not exit in another column in Pandas
- c# - 执行标量无法返回现有行
- scala - scalatest 中的补丁
- html - Pandas 表格中的第一列左对齐,其他列居中对齐
- javascript - 无法从会话中获取值到 PHP 中的索引
- linux - 在打开大量文件时导航 vim 分屏
- clojure - 在 Clojure 中将对象包装到集合中的惯用方法(如果它还不是集合)?
- c++ - 如何声明不同类型的模板类之间的转换
- swiftui - SwiftUI ScrollView 在进入屏幕之前过早渲染子视图
- mysql - 使用内部连接的 sql 选择查询