我正在使用以下代码注册我的所有控制器:
protected override void Load(ContainerBuilder builder)
{
builder.RegisterControllers(typeof(MvcApplication).Assembly)
.OnActivated(a => a.Context.InjectUnsetProperties(a.Instance))
.OnActivating(InjectInvoker);
}
private static void InjectInvoker(IActivatingEventArgs<object> obj)
{
var invoker = obj.Context.ResolveOptional<IActionInvoker>();
if (invoker != null)
{
((Controller)obj.Instance).ActionInvoker = invoker;
}
}
但现在我有一个控制器,它有2个相同类型的接口:
builder.Register(c => new RestClient(Url1))
.Named<IRestClient>("Url1")
.InstancePerLifetimeScope();
builder.Register(c => new RestClient(Url2))
.Named<IRestClient>("Url2")
.InstancePerLifetimeScope();
public HomeController(IRestClient r1, IRestClient r2)
我收到以下错误: 可以使用可用的服务和参数调用在'Site.Controllers.HomeController'类型上找到'Autofac.Core.Activators.Reflection.DefaultConstructorFinder'的构造函数: 无法解析构造函数'Void .ctor(RestSharp.IRestClient,RestSharp.IRestClient)'的参数'RestSharp.IRestClient r1'。 那是我所期待的,所以那么 我尝试添加以下代码:
builder.Register(
c =>
new HomeController(
c.ResolveNamed<IRestClient>("Url1"),
c.ResolveNamed<IRestClient>("Url2")))
.As<IController>()
.InstancePerLifetimeScope();
然后我再次遇到同样的错误。
那么在这种情况下注册控制器的正确方法是什么? 感谢。
答案 0 :(得分:1)
您需要在没有 .As<IController>()
的情况下注册您的控制器(或者您需要使用.AsSelf()
,但这是默认设置)。
您需要这样做,因为框架将尝试使用具体类型HomeController
而不是IController
接口来解析Controller(因此RegisterControllers
方法将所有控制器注册为{内部{1}}。
因此,以下注册应该有效
.AsSelf()
注意:您应该在<{strong> builder.Register(
c =>
new HomeController(
c.ResolveNamed<IRestClient>("Url1"),
c.ResolveNamed<IRestClient>("Url2")))
.InstancePerLifetimeScope();
电话后进行此次呼叫。