[英]SimpleInjector with Sitecore and WebApi controller does not have a default constructor
我們已經集成SimpleInjector( 4.4.x
我們) Sitecore 8.2
螺旋項目。
我們的基礎層中有一個依賴注入項目,它由以下管道組成:
public void Process(PipelineArgs args)
{
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
// register app dependencies (omitted for readability)
// get assemblies of our application
container.RegisterMvcControllers(assemblies);
container.RegisterWebApiControllers(GlobalConfiguration.Configuration,assemblies);
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
GlobalConfiguration.Configuration.DependencyResolver =
new SimpleInjectorWebApiDependencyResolver(container);
}
也如上述這篇文章中,流水線處理機在Sitecore的實現initialize
管道:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<pipelines>
<initializeDependencyInjection/>
<initialize>
<processor type="Company.Foundation.Example.DependencyInjectionProcessor, Company.Foundation.Example"
patch:before="processor[@type='Sitecore.Mvc.Pipelines.Loader.InitializeControllerFactory, Sitecore.Mvc']" />
</initialize>
</pipelines>
</sitecore>
</configuration>
如您所見,同時使用了ASP.NET MVC
和WebApi
( .NET 4.6
)。 我們的解決方案僅包含 MVC 控制器。 我們試圖實現的是在我們的解決方案中引入WebApi
。 添加以下控制器時,一切正常:
public class HelloController : ApiController
{
[HttpGet, Route("api/hello")]
public IHttpActionResult Get()
{
return Ok("Hello World!");
}
}
但是當我添加依賴項(並注冊)時,例如:
public interface IFoo
{
string Hello { get; }
}
public class Foo : IFoo
{
public string Hello => "Hello World!";
}
public class HelloController : ApiController
{
private readonly IFoo _foo;
public HelloController(IFoo foo)
{
_foo = foo;
}
[HttpGet, Route("api/hello")]
public IHttpActionResult Get()
{
return Ok(_foo.Hello);
}
}
執行 HTTP 請求時,我在運行時收到以下異常消息:
System.InvalidOperationException:嘗試創建類型為“HelloController”的控制器時出錯。 確保控制器具有無參數的公共構造函數。
堆棧跟蹤:
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
at System.Web.Http.Dispatcher.HttpControllerDispatcher.<SendAsync>d__15.MoveNext()
內部異常:
System.ArgumentException:類型“Company.Feature.Example.HelloController”沒有默認構造函數
at System.Linq.Expressions.Expression.New(Type type)
at System.Web.Http.Internal.TypeActivator.Create[TBase](Type instanceType)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.GetInstanceOrActivator(HttpRequestMessage request, Type controllerType, Func`1& activator)
at System.Web.Http.Dispatcher.DefaultHttpControllerActivator.Create(HttpRequestMessage request, HttpControllerDescriptor controllerDescriptor, Type controllerType)
讓我感到奇怪的是container.Verify()
不會拋出任何異常或警告。 調試的時候可以看到在container
的Root Registrations
中注冊了HelloController
。
WebApi
的綁定重定向WebApi
根項目的web.config
中設置:
<dependentAssembly>
<assemblyIdentity name="System.Web.Http" publicKeyToken="31bf3856ad364e35" xmlns="urn:schemas-microsoft-com:asm.v1" />
<bindingRedirect oldVersion="0.0.0.0-5.2.3.0" newVersion="5.2.3.0" xmlns="urn:schemas-microsoft-com:asm.v1" />
</dependentAssembly>
根據這個答案,正如史蒂文在評論中所建議的那樣,依賴解析器稍后會在 Sitecore 管道中被覆蓋。
我擴展了initialize
管道:
<configuration xmlns:patch="http://www.sitecore.net/xmlconfig/">
<sitecore>
<pipelines>
<initializeDependencyInjection/>
<initialize>
<processor type="Company.Foundation.Example.DependencyInjectionProcessor, Company.Foundation.Example"
patch:before="processor[@type='Sitecore.Mvc.Pipelines.Loader.InitializeControllerFactory, Sitecore.Mvc']" />
<processor type=" Company.Foundation.Example.WebApiDependenceResolverProcessor, Company.Foundation.Example"
patch:after="*[@type='Sitecore.PathAnalyzer.Services.Pipelines.Initialize.WebApiInitializer, Sitecore.PathAnalyzer.Services']" />
</initialize>
</pipelines>
</sitecore>
</configuration>
我還添加了以下處理器:
public class WebApiDependenceResolverProcessor
{
public void Process(PipelineArgs args)
{
// retrieve container here
GlobalConfiguration.Configuration.DependencyResolver = new SimpleInjectorWebApiDependencyResolver(container);
}
}
在這里,我們設置了 Sitecore 重置WebApi
后的依賴解析器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.