У меня есть веб-приложение MVC 3, где я использую Entity Framework для доступа к данным.Кроме того, я просто использовал шаблон репозитория, где, например, все связанные с продуктом вещи обрабатываются в «ProductRepository», а все связанные с пользователем вещи обрабатываются в «UserRepository».
Таким образом, я использую контейнер UNITY для создания одноэлементного экземпляра DataContext, который я внедряю в каждое из репозиториев.Быстрый поиск в Google, и каждый рекомендует НЕ использовать одноэлементный экземпляр DataContext, так как это может привести к утечкам памяти в будущем.
Итак, вдохновленный этим постом, создание единственного экземпляра DataContext для каждого веб-запроса является ответом (пожалуйста, исправьте меня, если я ошибаюсь!)
http://blogs.microsoft.co.il/blogs/gilf/archive/2010/05/18/how-to-manage-objectcontext-per-request-in-asp-net.aspx
Однако UNITY не поддерживает диспетчер времени жизни для каждого веб-запроса.Но можно реализовать свой собственный менеджер времени жизни, который обрабатывает это для вас.На самом деле, это обсуждается в этом посте:
Синглтон-контекст на вызов (веб-запрос) в Unity
Вопрос в том, что теперь я реализовал пользовательский менеджер времени жизни какописано в посте выше, но я не уверен, если это способ сделать это.Мне также интересно, где находится экземпляр datacontext в предоставленном решении?Я что-то упускаю?
Есть ли на самом деле лучший способ решения моей "проблемы"?
Спасибо!
** Добавлена информация о моей реализации **
Ниже приведены фрагменты из моего Global.asax, Controller и Repository.Это дает четкую картину моей реализации.
Global.asax
var container = new UnityContainer();
container
.RegisterType<ProductsRepository>(new ContainerControlledLifetimeManager())
.RegisterType<CategoryRepository>(new ContainerControlledLifetimeManager())
.RegisterType<MyEntities>(new PerResolveLifetimeManager(), dbConnectionString)
Контроллер
private ProductsRepository _productsRepository;
private CategoryRepository _categoryRepository;
public ProductsController(ProductsRepository productsRepository, CategoryRepository categoryRepository)
{
_productsRepository = productsRepository;
_categoryRepository = categoryRepository;
}
public ActionResult Index()
{
ProductCategory category = _categoryRepository.GetProductCategory(categoryId);
.
.
.
}
protected override void Dispose(bool disposing)
{
base.Dispose(disposing);
_productsRepository.Dispose();
_categoryRepository.Dispose();
}
Хранилище продуктов
public class ProductsRepository : IDisposable
{
private MyEntities _db;
public ProductsRepository(MyEntities db)
{
_db = db;
}
public Product GetProduct(Guid productId)
{
return _db.Product.Where(x => x.ID == productId).FirstOrDefault();
}
public void Dispose()
{
this._db.Dispose();
}
Фабрика контроллеров
public class UnityControllerFactory : DefaultControllerFactory
{
IUnityContainer _container;
public UnityControllerFactory(IUnityContainer container)
{
_container = container;
}
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
throw new HttpException(404, String.Format("The controller for path '{0}' could not be found" +
"or it does not implement IController.",
requestContext.HttpContext.Request.Path));
}
return _container.Resolve(controllerType) as IController;
}
}
Дополнительная информация Привет, я опубликую дополнительные ссылки, с которыми я сталкиваюсь, относительно связанной проблемы и решенияпредложения:
- http://cgeers.wordpress.com/2009/02/21/entity-framework-objectcontext/#objectcontext
- http://dotnetslackers.com/articles/ado_net/Managing-Entity-Framework-ObjectContext-lifespan-and-scope-in-n-layered-ASP-NET-applications.aspx
- присоединение linq к sql datacontext к httpcontext на бизнес-уровне
- http://weblogs.asp.net/shijuvarghese/archive/2008/10/24/asp-net-mvc-tip-dependency-injection-with-unity-application-block.aspx
- http://msdn.microsoft.com/en-us/library/bb738470.aspx