如何创建autofac工厂以解决依赖关系
本文关键字:工厂 解决 依赖 关系 autofac 何创建 创建 | 更新日期: 2023-09-27 18:21:06
我正在使用IDbcontext访问我的数据库
public sealed class DbContext : IDbContext
{
private bool disposed;
private SqlConnection connection;
public DbContext(string connectionString)
{
connection = new SqlConnection(connectionString);
}
public IDbConnection Connection
{
get
{
if (disposed) throw new ObjectDisposedException(GetType().Name);
return connection;
}
}
public IDbTransaction CreateOpenedTransaction()
{
if (connection.State != ConnectionState.Open)
Connection.Open();
return Connection.BeginTransaction();
}
public IEnumerable<T> ExecuteProcedure<T>(string procedure, dynamic param = null, IDbTransaction transaction = null)
{
if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
return Dapper.SqlMapper.Query<T>(connection, procedure, param, transaction,
commandType: CommandType.StoredProcedure);
}
public int ExecuteProcedure(string procedure, dynamic param = null, IDbTransaction transaction = null)
{
if (connection.State == ConnectionState.Closed)
{
connection.Open();
}
return Dapper.SqlMapper.Execute(connection, procedure, param, transaction,
commandType: CommandType.StoredProcedure);
}
public void Dispose()
{
Debug.WriteLine("** Disposing DbContext");
if (disposed) return;
if (connection != null)
{
connection.Dispose();
connection = null;
}
disposed = true;
}
}
我有两个数据库"第一个"answers"第二个"
在解决拳头的问题时,我使用
builder.Register<IDbContext>(c =>
new DbContext(ConfigurationManager.ConnectionStrings["first"].ConnectionString))
.InstancePerDependency();
所以我需要添加:
builder.Register<IDbContext>(c =>
new DbContext(ConfigurationManager.ConnectionStrings["second"].ConnectionString))
.InstancePerDependency();
我需要为Dbcontext创建一个工厂,并使用带有autofac的NamedResolve,我该怎么做??
public class DbContextFactory
{
private ILifetimeScope m_RootLifetimeScope;
public DbContextFactory(ILifetimeScope rootLifetimeScope)
{
m_RootLifetimeScope = rootLifetimeScope;
}
public IDbContext CreateDbContext()
{
if (logic for selection first dbcontext)
{
return m_RootLifetimeScope.ResolveNamed<IDbContext>("first");
}
else if (logic for selection second dbcontext)
{
return m_RootLifetimeScope.ResolveNamed<IDbContext>("second");
}
else
{
throw new NotSupportedException();
}
}
}
//registration
builder.RegisterType<DbContextFactory>().SingleInstance();
//using
var factory = yourContainer.Resolve<DbContextFactory>();
var context = factory.CreateDbContext();