Entity framework 在运行时为每个调用将连接字符串传递给实体框架
我的实体框架上下文如下Entity framework 在运行时为每个调用将连接字符串传递给实体框架,entity-framework,asp.net-web-api,connection-string,autofac,Entity Framework,Asp.net Web Api,Connection String,Autofac,我的实体框架上下文如下 public partial class MyContext : DbContext, IMyContext { static MyContext() { System.Data.Entity.Database.SetInitializer<MyContext>(null); } public MyContext() : base("Name=MyContext") { }
public partial class MyContext : DbContext, IMyContext
{
static MyContext()
{
System.Data.Entity.Database.SetInitializer<MyContext>(null);
}
public MyContext()
: base("Name=MyContext")
{
}
现在我的问题是,我想在每次调用中动态设置连接字符串。连接字符串将通过一个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();
在web API调用的开始(例如通过属性),您可以调用Initialize
方法。因为工厂是InstancePerRequest
,所以在请求期间将有一个实例
顺便说一句,我不太明白这个注册
builder.RegisterType(typeof(MainContext)).As(typeof(DbContext)).InstancePerLifetimeScope();
builder.RegisterType<MainContext>().As<IMainContext>().InstancePerRequest();
我们可以聊天来讨论这个问题吗?我需要在使用上下文的任何地方注入上下文工厂吗。问题是我在Repositoty和unitofwork中都使用了上下文。我可以寄给你代码样本吗?
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();
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);
}
}
builder.RegisterType(typeof(MainContext)).As(typeof(DbContext)).InstancePerLifetimeScope();
builder.RegisterType<MainContext>().As<IMainContext>().InstancePerRequest();
builder.RegisterType<MainContext>()
.As<IMainContext>()
.As<DbContext>()
.InstancePerRequest();