Я создаю сайт ASP.NET Web API 2.1, и поскольку я хочу встраивать зависимости непосредственно в контроллеры, я создал свою собственную реализацию IDependencyResolver, чтобы StructureMap обработал это для меня.
public class StructureMapDependencyResolver : IDependencyResolver
{
public IDependencyScope BeginScope()
{
return this;
}
public object GetService(Type serviceType)
{
return ObjectFactory.GetInstance(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return ObjectFactory.GetAllInstances(serviceType).Cast<object>();
}
public void Dispose()
{
}
}
Затем я сказал Web API использовать этот класс, добавив эту строку в метод Application_Start в Global.asax
GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver();
Это скомпилировано, но когда я попытался получить доступ к любому из методов API в браузере, я получил ошибку, подобную этой
No Default Instance defined for PluginFamily System.Web.Http.Hosting.IHostBufferPolicySelector, System.Web.Http
Это было относительно легко решить, поскольку я добавил строку в конфигурацию StructureMap
this.For<IHostBufferPolicySelector>().Use<WebHostBufferPolicySelector>();
Однако затем я получил другие подобные ошибки для других классов System.Web.Http, и хотя я мог решить некоторые из них, я застрял в том, как иметь дело с тремя из них, а именно с ITraceManager, IExceptionHandler и IContentNegotiator.
Проблема заключается в том, что TraceManager, который по-видимому является реализацией ITraceManager по умолчанию, является внутренним классом, поэтому я не могу ссылаться на него в моей конфигурации StructureMap.
Итак, я об этом совершенно неправильно, или есть какой-то другой способ вставить эти внутренние классы?