Я создал небольшой локатор служб, который буду использовать в ActionFilterAttributes и IHttpModules. На момент написания я использую простой инжектор, но хочу сделать его контейнерной агности c. Идея состоит в том, чтобы позволить потребителям моего фреймворка вводить дополнительную конфигурацию в мои классы, например:
container.RegisterInstance<IConfiguration>(() => new CustomConfiguration());
Ниже мой текущий черновик. Пожалуйста, не стесняйтесь предлагать любые улучшения. На ум пришло то, насколько хорошо он будет относиться к услуге с ограниченным образом жизни. Например, если я запрашиваю службу в фильтре OnActionExecuting
, поймет ли контейнер, что служба запрашивается в области веб-запроса, или мне нужно явно создать область? Конфигурация будет одинарной, так что это не будет проблемой с указанной зависимостью c, просто спрашиваю из любопытства.
public class ServiceLocator
{
public static T GetService<T>()
{
return (T)GetDependencyScope().GetService(typeof(T));
}
private static IDependencyScope GetDependencyScope()
{
if (HttpContext.Current.Items["MS_HttpRequestMessage"] is HttpRequestMessage httpRequestMessage)
{
return httpRequestMessage.GetDependencyScope();
}
return GlobalConfiguration.Configuration.DependencyResolver;
}
}