Как использовать LightInject с веб-формами? - PullRequest
1 голос
/ 16 апреля 2020

У меня есть устаревшее целевое приложение ASP. Net Web Forms. Net 4.8, в котором я хотел бы использовать внедрение зависимостей. Наш движок выбора - LightInject.

. С помощью этот ответ и исходный код ContainerServiceProvider.Cs от Microsoft.As pNet .WebFormsDependencyInjection. Проект Unity, я смог создать свой собственный IServiceProvider контейнер для LightInject и назначить его для HttpRuntime.WebObjectActivator :

void Application_Start(object sender, EventArgs e)
{
    ...

    // Register the service provider
    ContainerServiceProvider containerServiceProvider = new ContainerServiceProvider(HttpRuntime.WebObjectActivator);
    HttpRuntime.WebObjectActivator = containerServiceProvider;

    // Register services used with dependency injection
    var container = containerServiceProvider.Container;
    container.Register<IDummyService, DummyService>();
}

Я могу зарегистрировать свой сервисы и доступ к ним через HttpRuntime.WebObjectActivator.GetService().

Однако мне еще предстоит увидеть внедрение конструктора (или свойства) в действие ... Когда я объявляю страницу ASPX (скажем, About.aspx) со следующим конструктором , Я получаю сообщение об ошибке при доступе к странице: «About» не содержит конструктор, который принимает 0 аргументов »

public About(IDummyService dummy)
{
    ...
}

A screenshot of the error that occurs when accessing the page

РЕДАКТИРОВАТЬ : это произошло из-за того, что веб-сайт нацелен на более старую версию. Net в своем конфигурационном файле. Ретаргетинг 4.8 исправил эту первую проблему.

Теперь проблема другая: если я отлаживаю ContainerServiceProvider, который я реализовал, я вижу, что. Net пытается получить ASP.about_aspx служба, определенная во временной сборке (например: C:/Windows/Microsoft.NET/Framework64/v4.0.30319/Temporary ASP.NET Files/root/e15e9fc8/41270200/App_Web_cdps00j5.DLL), о которой мой контейнер LightInject не знает.

Так что я не уверен, что еще мне нужно сделать, чтобы на моих страницах работало внедрение конструктора , Я предполагаю, что должен сообщить LightInject, что мои страницы являются кандидатами для внедрения зависимости, но я понятия не имею, как это сделать (документации очень мало). Кроме того, мне интересно, как работает Unity, потому что я не смог увидеть магию c в исходном коде Microsoft.As pNet .WebFormsDependencyInjection.Unity , кроме реализации ContainerServiceProvider.cs что я использовал повторно.

ОБНОВЛЕНИЕ: Я попытался вручную зарегистрировать все типы, которые реализуют страницы, но это не сработало:

foreach (var assembly in BuildManager.GetReferencedAssemblies().Cast<Assembly>())
{
    try
    {
        container.RegisterAssembly(
            assembly,
            () => new LightInject.PerScopeLifetime(),
            (serviceType, implementingType) => serviceType.IsSubclassOf(typeof(System.Web.UI.Page)));
    }
    catch
    {
    }
}
...