widziałem kod jak poniżej tutorial EF code first
, MVC
i StructureMap
stworzyć Context Per Request
wzoru:jest wymagana HttpContextScoped StructureMaped?
protected void Application_Start()
{
...
initStructureMap();
}
private static void initStructureMap()
{
ObjectFactory.Initialize(x =>
{
x.For<IUnitOfWork>().HttpContextScoped().Use(() => new Context());
x.For<IFirstEntity>().Use<FirstEntity>();
x.For<ISecondEntity>().Use<SecondEntity>();
x.For<IThirdEntity>().Use<ThirdEntity>();
});
ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
}
protected void Application_EndRequest(object sender, EventArgs e)
{
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}
public class StructureMapControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
return ObjectFactory.GetInstance(controllerType) as Controller;
}
}
FirstEntity
, SecondEntity
i ... wszyscy potrzebujemy IunitOfWork
w ich konstruktora.
jak widać to po prostu wykorzystuje HttpContextScoped()
dla innych i nie Context
w przypadku EndRequest
wywołuje ReleaseAndDisposeAllHttpScopedObjects()
.
1- czy to jest prawidłowe podejście?
2- należy użyć HttpContextScoped() dla wszystkich innych Service layer Interfaces
lub nie tylko dla IUnitOfWork
? np
x.For<IFirstEntity>().Use<FirstEntity>();
lub
x.For<IFirstEntity>().HttpContextScoped().Use(() => new FirstEntity());
3- ReleaseAndDisposeAllHttpScopedObjects()
dysponuje wszystkie przykłady lub tylko dysponuje Context
?
Zaktualizowałem pytanie 2 –
Zaktualizowana odpowiedź. O ile nie trzeba utrzymywać tego samego stanu lub instancja jest droga do stworzenia i może współużytkować stan podczas żądania, należy przejść z obiektami przejściowymi. – PHeiberg
dziękuję, mój problem jest wtedy, gdy te wystąpienia zostaną usunięte? czy oni też dysponują w EndRequest, czy nie? –