У меня есть устаревшее целевое приложение 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)
{
...
}
РЕДАКТИРОВАТЬ : это произошло из-за того, что веб-сайт нацелен на более старую версию. 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
{
}
}