Инициализация контейнера StructureMap в Application_Start, но он нулевой в Application_BeginRequest - PullRequest
0 голосов
/ 12 июня 2018

В моем WebApiApplication я пытаюсь инициализировать IContainer в Application_Start и сохранить его в поле _container:

public class WebApiApplication : System.Web.HttpApplication
{
    private IContainer _container;

    public IContainer Container
    {
        get => (IContainer)HttpContext.Current.Items[nameof(Container)];
        set => HttpContext.Current.Items[nameof(Container)] = value;
    }

    protected void Application_Start()
    {
        _container = new Container(_ => _.Scan(scan =>
        {
            scan.TheCallingAssembly();
            scan.WithDefaultConventions();
            scan.With(new ControllerConvention());
        }));

        AreaRegistration.RegisterAllAreas();
        GlobalConfiguration.Configure(WebApiConfig.Register);
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
        DependencyResolver.SetResolver(new StructureMapDependencyResolver(() => 
            Container ?? _container.GetNestedContainer()));


    }

    public void Application_BeginRequest() =>
        Container = _container.GetNestedContainer();

    public void Application_EndRequest()
    {
        Container.Dispose();
        Container = null;
    }
}

При отладке, где-то между закрытием Application_Start() иначало Application_BeginRequest(), поле _container становится null.

Что я здесь не так делаю?

1 Ответ

0 голосов
/ 13 июня 2018

Вам нужно добавить static, чтобы контейнер работал в течение времени жизни приложения .

private static IContainer _container
...