Как изменить строку подключения во время выполнения с EF и Structuremap? - PullRequest
0 голосов
/ 18 сентября 2018

Я работаю в веб-приложении .net MVC и использую EF (DB FIRST) для получения данных:

    public class LocationManager: MyNetworkEntities,  ILocationManager
    {
        private readonly MyNetworkEntities _dbContext = new MyNetworkEntities();

        public LocationManager(MyNetworkEntities context, string connection)
        {
            // extension for changing connectionstring at runtime
            if(connection != null)
            context.ChangeDatabase
                    (
                        dataSource: connection 
                    );


        _dbContext = context;
    }

    public List<Locations> GetAll()
    {
        return _dbContext.Locations.ToList();
    }
}

Также использую Structuremap:

public DefaultRegistry() {
    Scan(
        scan => {
            scan.TheCallingAssembly();
            scan.WithDefaultConventions();
            scan.With(new ControllerConvention());
        });
    For<ILocationManager>().Use<LocationManager>();
}

Мой контроллер:

public class UserController : Controller
{
    private readonly ILocationManager _locationManager;

    public UserController(ILocationManager locationManager)
    {
        _locationManager = locationManager;
    }
    // GET: User
    public ActionResult Index()
    {
        var t = _locationManager.GetAll();
        return View("UserManagment");
    }
}

Вопрос:

Поскольку я хочу изменить строку db-connection во время выполнения, как бы я это сделал при использовании Structuremap?

Что-то вроде:

string myNewConnection = "connection";
 var t = _locationManager.setConnection(myNewConnection).GetAll();

Как мне это сделать?

Примечание: приведенный выше код не завершен, я все еще пытаюсь решить эту проблему.

1 Ответ

0 голосов
/ 18 сентября 2018

Я думаю, ваш EF Core DbContext выглядит следующим образом:

public MyDbContext(DbContextOptions<MyDbContext> options)
    : base(options)
{
}

В этом случае вы можете просто создать свой DbContext (вам не нужно использовать DI везде) иукажите нужную базу данных:

var connectionString = ...
var builder = new DbContextOptionsBuilder<MyDbContext>().UseSqlServer(connectionString);
var context = new MyDbContext(builder.Options);
var locations = context.Locations.ToList();

Конечно, вы можете реализовать что-то более изощренное, например, создание класса фабрики DbContext, указывающего, где вам нужно, и зарегистрировать эту фабрику с помощью DI, чтобы получить ее с помощью механизма инжекции в конструктор,У фабрики будет такой метод, как:

// This is a pseudo code below
factory.CreateDbContext (.. some parameters to detect which DB to use ..)
...