Я читал другие сообщения об этом и загружался в сеть, но я все еще не уверен, если у меня есть все правильно.
Я использую servicehostfactory для инициализации StructureMap в соответствующем сервисе.. (на основе этого) Snippet ниже..
public class StructureMapServiceHostFactory : ServiceHostFactory
{
public StructureMapServiceHostFactory()
{
Bootstrapper.ConfigureDependencies();
}
protected override ServiceHost CreateServiceHost(Type serviceType, Uri[] baseAddresses)
{
return new StructureMapServiceHost(serviceType, baseAddresses);
}
}
и бутстрапинг..
public static IContainer ConfigureDependencies()
{
if (AlreadyRegistered)
{
return ObjectFactory.Container;
}
lock (_lockThis)
{
if (AlreadyRegistered)
{
return ObjectFactory.Container;
}
BootstrapStructureMap();
AlreadyRegistered = true;
}
return ObjectFactory.Container;
}
public static void BootstrapStructureMap()
{
ObjectFactory.Initialize(x =>
{
x.AddRegistry<InfrastructureRegistry>();
});
}
public class InfrastructureRegistry : Registry
{
public InfrastructureRegistry()
{
For<Entities>().HybridHttpOrThreadLocalScoped().Use(c => new Entities());
...
Регистрация моего контекста Entity Framework - HybridHttpOrThreadLocalScoped. В Application_EndRequest я выпускаю объекты с ограниченным доступом к http, которые должны быть только контекстом db, так как это я хочу для каждого запроса службы.
protected void Application_EndRequest(object sender, EventArgs e)
{
Bootstrapper.ReleaseAndDisposeAllHttpScopedObjects();
}
public static void ReleaseAndDisposeAllHttpScopedObjects()
{
ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}
Это правильный подход или я что-то упускаю? Таким образом, мне не нужно использовать оператор using вокруг моего контекста, так как он должен быть привязан к этому запросу, а следующий запрос получает другой.
Основная причина заключается в том, что время от времени, когда я получаю доступ к субобъекту объекта, объект имеет значение null, тогда как он должен быть, и я пытаюсь устранить тот факт, что это может быть общий контекст.
Я попытался выписать контекст на Application_EndRequest
var instance = StructureMap.ObjectFactory.GetInstance<AXA_Entities.Entities>(); - write to file then
и hashCode был уникален, но Calling GetInstance будет каждый раз получать новый экземпляр каждый раз, когда я представляю?
Я думаю, что я близко к этому, но объяснение чего-то, что я, возможно, отсутствует, оценили.
В идеале я хочу, чтобы моя область была такой.
For<Entities>().HttpContextScoped().Use(c => new Entities());
но в результате я получаю следующий метод.
"StructureMap Exception Code: 309\nYou cannot use the HttpContextLifecycle outside of a web request. Try the HybridLifecycle instead."
unitofwork-in-wcf-using-structuremap ответил, что я должен делать. Есть и другие ссылки внутри, поэтому внимательно прочитайте. Я не использую интерфейс uow, но пользовательский жизненный цикл - это то, что я использовал в конце.
на версии 2.6.4 структуры map - последняя версия изменила некоторые интерфейсы, так что пока еще не обновлена.
For<Entities>().LifecycleIs(new WcfInstanceContextLifecycle()).Use(c
=> new Entities());