DependencyResolver:传递参数(DependencyResolver: Pass p

2019-10-17 03:09发布

我用autofac并且可以传递参数给我解决方法。

我怎样才能做到这一点使用微软DependencyResolver接口?

Answer 1:

该的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范围内都有效。 试图解决Xapplication范围将失败,这条消息:

不带标签匹配“HTTP”范围是其中要求实例的范围可见。

从解决request范围,因为预期将工作:

var f = request.Resolve<Func<IX>>();
var x = f();


Answer 2:

一般的建议是解决一个工厂。 要么你定义你需要解决的类型的定制工厂接口(这有我的偏好),或解决一个委托(这是彼得Lillevold建议)。 无论哪种方式,你不应该调用容器(或DependencyResolver直接为此事),因为这是次优 。



文章来源: DependencyResolver: Pass parameters