我的实体框架上下文如下
public partial class MyContext : DbContext, IMyContext
{
static MyContext()
{
System.Data.Entity.Database.SetInitializer<MyContext>(null);
}
public MyContext()
: base("Name=MyContext")
{
}
我通过以下方式通过autofac解决它
builder.RegisterType(typeof(MainContext)).As(typeof(DbContext)).InstancePerLifetimeScope();
builder.RegisterType<MainContext>().As<IMainContext>().InstancePerRequest();
此数据库上下文在存储库层中被调用
#region Fields
private readonly IMyContext _context;
#endregion
#region Constructors and Destructors
public EmployeeRepository(IMyContext context)
{
_context = context;
}
#endregion
public void Create(Employee emp)
{
this._context.Employee.Add(emp);
}
现在我的问题是,我想为每个调用动态设置连接字符串。连接字符串将通过我要传递到此上下文的webapi传递。谁能帮助我该怎么做?我对这里的autofac感到困惑。其次,我如何确保每个调用都设置了连接字符串并且不对其进行缓存。
您可以使用工厂来构建上下文并为您设置连接字符串。
public interface IContextFactory
{
IContext GetInstance();
}
public class MyContextFactory : IContextFactory
{
public IContext GetInstance()
{
String connectionString = this.GetConnectionString(HttpContext.Current);
return new MyContext(connectionString);
}
private String GetConnectionString(HttpContext context)
{
// do what you want
}
}
builder.RegisterType<MyContextFactory>()
.As<IContextFactory>()
.InstancePerRequest();
builder.Register(c => c.Resolve<IContextFactory>().GetInstance())
.As<IContext>()
.InstancePerRequest();
如果无法基于HttpContext获取连接字符串,则可以在创建实例之前更改contextFactory实现以期望通过WebAPI进行初始化。例如 :
public interface IContextFactory
{
IContext GetInstance();
void Initialize(String connectionString);
}
public class MyContextFactory : IContextFactory
{
private String _connectionString;
public void Initialize(String connectionString)
{
this._connectionString = connectionString;
}
public IContext GetInstance()
{
if (this._connectionString == null)
{
throw new Exception("connectionString not initialized");
}
return new MyContext(this._connectionString);
}
}
在Web API调用开始时(例如,通过属性),您可以调用Initialize
方法。因为工厂是InstancePerRequest
您,所以请求期间将只有一个实例。
顺便说一句,我不确定是否了解此注册
builder.RegisterType(typeof(MainContext)).As(typeof(DbContext)).InstancePerLifetimeScope();
builder.RegisterType<MainContext>().As<IMainContext>().InstancePerRequest();
它看起来有问题,因为您将拥有2个相同类型的不同注册,而不是同一范围的注册,这是有目的的吗?此外,注册a听起来不是一个好主意DbContext
,您需要此注册吗?
以下注册看起来更好:
builder.RegisterType<MainContext>()
.As<IMainContext>()
.As<DbContext>()
.InstancePerRequest();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句