Использование структуры инжектора зависимостей / инверсии управления, например:
- Ninject
- Autofac
- StructureMap
- Unity
Используя контейнер IoC, вы можете указать ему, как управлять единым контекстом данных (чаще всего для каждого запроса).Когда вы устанавливаете контекст данных для каждого запроса, контейнер автоматически передает любому классу, которому нужен контекст данных, один и тот же контекст данных для каждого запроса.
Вот хорошая статья о настройкевверх Ninject.
Как скорее всего будет выглядеть ваш код, при условии, что вы используете универсальный репозиторий:
Ninject Module:
public class NinjectRegistrationModule : NinjectModule
{
public override void Load()
{
Bind<MyDataContext>().ToSelf().InRequestScope();
Bind(typeof(RepositoryImplementation<>)).ToSelf().InRequestScope();
}
}
Общий репозиторий:
public RepositoryImplementation<T> : IRepository<T> where T : class
{
MyDataContext _dataContext;
public RepositoryImplementation<T>(MyDataContext dataContext)
{
_dataContext = dataContext;
}
// bunch of methods that utilize _dataContext
}
Класс обслуживания:
public class MyServiceClass
{
IRepository<SomeEntity> _someEntityRepository;
public MyServiceClass(IRepository<SomeEntity> someEntityRepository)
{
_someEntityRepository = someEntityRepository;
}
// do stuff with _someEntityRepository = someEntityRepository;
}
Контроллер:
public class MyController
{
MyServiceClass _myServiceClass;
public MyController(MyServiceClass myServiceClass)
{
// Ninject will auto-magically give us a myServiceClass
// which will Ninject will inject a repository into MyServiceClass's constructor
_myServiceClass = myServiceClass;
}
public ActionResult MyAction()
{
// use _myServiceClass to do stuff
return View();
}
}