Предполагая, что есть приложение ASP.NET MVC, которое использует Entity Framework 6 с кодовым подходом и StructureMap как IoC.
Кроме того, он использует шаблон Unit Of Work.
Вот коды:
Класс домена
public class Product
{
public int Id { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
IUnitOfWork и DbContext:
public interface IUnitOfWork
{
IDbSet<TEntity> Set<TEntity>() where TEntity : class;
int SaveChanges();
}
public class Sample07Context : DbContext, IUnitOfWork
{
public DbSet<Product> Products { set; get; }
#region IUnitOfWork Members
public new IDbSet<TEntity> Set<TEntity>() where TEntity : class
{
return base.Set<TEntity>();
}
#endregion
}
Бизнес-логика в классах обслуживания:
public interface IProductService
{
void AddNewProduct(Product product);
IList<Product> GetAllProducts();
}
public class ProductService : IProductService
{
IUnitOfWork _uow;
IDbSet<Product> _products;
public ProductService(IUnitOfWork uow)
{
_uow = uow;
_products = _uow.Set<Product>();
}
public void AddNewProduct(Product product)
{
_products.Add(product);
}
public IList<Product> GetAllProducts()
{
return _products.Include(x => x.Category).ToList();
}
}
Ввод класса обслуживания в контроллер
public class HomeController : Controller
{
private IProductService _productService;
private IUnitOfWork _uow;
public HomeController(IUnitOfWork uow, IProductService productService)
{
_productService = productService;
_uow = uow;
}
[HttpGet]
public ActionResult Index()
{
var list = _productService.GetAllProducts();
return View(list);
}
}
Конфигурация StructureMap, которую мы вызываем в app_start:
private static void initStructureMap()
{
ObjectFactory.Initialize(x =>
{
x.For<IUnitOfWork>().HttpContextScoped().Use(() => new Sample07Context());
x.ForRequestedType<IProductService>().TheDefaultIsConcreteType<EfProductService>();
});
//Set current Controller factory as StructureMapControllerFactory
ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
}
Все работает отлично с единой базой данных, но в моем сценарии пользователь может использовать несколько баз данных, я имею в виду, что пользователь должен иметь возможность изменять строку соединения во время выполнения. Мы создаем отдельную базу данных для каждого проекта, созданного пользователем в приложении.
Теперь проблема заключается в том, что мы добавляем DbContext для обслуживания, а DbContext считывает строку подключения из web.config, поэтому, когда пользователь меняет базу данных, мы не можем установить новую строку подключения для DbContext.
Что вы предлагаете?