防止简单注入器与 Umbraco 控制器发生冲突
Preventing simple injector from conflicting with Umbraco controllers
尽管在我的 Umbraco 解决方案中只注册了我自己的 mvc 控制器,但简单的注入器似乎也影响了 Umbraco 的后台控制器。如果我 运行 下面的代码片段,Umbraco 后台控制器出现异常,类似于 this thread.
中的问题
我是否还需要添加自定义控制器激活器之类的东西?
protected void Application_Start(object sender, EventArgs e) {
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
var registeredControllerTypes =
SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
container, Assembly.GetExecutingAssembly())
.Where(type => type.IsSubClassOf(typeof(MyController)));
foreach (var controllerType in registeredControllerTypes)
{
container.Register(controllerType, controllerType, Lifestyle.Transient);
}
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
已通过@Steven 评论的更新版本解决:
public class UmbracoConstructorBehavior : IConstructorResolutionBehavior
{
public IConstructorResolutionBehavior DefaultBehavior { get; set; }
public ConstructorInfo GetConstructor(Type implementationType)
{
return implementationType.Namespace != null
&& implementationType.Namespace.Contains("Umbraco")
? GetUmbracoConstructor(implementationType)
: DefaultBehavior.GetConstructor(implementationType);
}
private ConstructorInfo GetUmbracoConstructor(Type i) =>
i.GetConstructors().OrderBy(c => c.GetParameters().Length).FirstOrDefault()
?? DefaultBehavior.GetConstructor(i);
}
尽管在我的 Umbraco 解决方案中只注册了我自己的 mvc 控制器,但简单的注入器似乎也影响了 Umbraco 的后台控制器。如果我 运行 下面的代码片段,Umbraco 后台控制器出现异常,类似于 this thread.
中的问题我是否还需要添加自定义控制器激活器之类的东西?
protected void Application_Start(object sender, EventArgs e) {
var container = new Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
var registeredControllerTypes =
SimpleInjectorMvcExtensions.GetControllerTypesToRegister(
container, Assembly.GetExecutingAssembly())
.Where(type => type.IsSubClassOf(typeof(MyController)));
foreach (var controllerType in registeredControllerTypes)
{
container.Register(controllerType, controllerType, Lifestyle.Transient);
}
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
}
已通过@Steven 评论的更新版本解决:
public class UmbracoConstructorBehavior : IConstructorResolutionBehavior
{
public IConstructorResolutionBehavior DefaultBehavior { get; set; }
public ConstructorInfo GetConstructor(Type implementationType)
{
return implementationType.Namespace != null
&& implementationType.Namespace.Contains("Umbraco")
? GetUmbracoConstructor(implementationType)
: DefaultBehavior.GetConstructor(implementationType);
}
private ConstructorInfo GetUmbracoConstructor(Type i) =>
i.GetConstructors().OrderBy(c => c.GetParameters().Length).FirstOrDefault()
?? DefaultBehavior.GetConstructor(i);
}