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();