我用autofac并且可以传递参数给我解决方法。
我怎样才能做到这一点使用微软DependencyResolver接口?
我用autofac并且可以传递参数给我解决方法。
我怎样才能做到这一点使用微软DependencyResolver接口?
该的IDependencyResolver不直接支持传递参数,因为我相信你已经注意到了。 不过,既然你有Autofac在引擎盖下,你能解决工厂的委托,使您可以传递参数给底层服务:
var factory = dependencyResolver.GetService<Func<int, string, IService>>();
var service = factory(5, "42");
注意:您可以使用Func
代表或明确定义的工厂代表。 更多关于此这里 。
关于寿命范围:工厂代表必须从所请求的服务可以“达到”一个范围来解决。 考虑这个设置模拟MVC还是怎么的WebAPI会是什么样子:
var cb = new ContainerBuilder();
cb.RegisterType<X>().InstancePerMatchingLifetimeScope("http");
var application = cb.Build();
var request = application.BeginLifetimeScope("http");
在此设置下,我们的X
服务将只能在HTTP范围内都有效。 试图解决X
的application
范围将失败,这条消息:
不带标签匹配“HTTP”范围是其中要求实例的范围可见。
从解决request
范围,因为预期将工作:
var f = request.Resolve<Func<IX>>();
var x = f();
一般的建议是解决一个工厂。 要么你定义你需要解决的类型的定制工厂接口(这有我的偏好),或解决一个委托(这是彼得Lillevold建议)。 无论哪种方式,你不应该调用容器(或DependencyResolver
直接为此事),因为这是次优 。