Fre*_*Ali 5 c# dependency-injection autofac xamarin
我有一个Xamarin.Forms应用程序,其中使用 Autofac 进行 DI。
所以我想要的很简单,但我无法做一些看起来很容易做的事情。
所以我有一个类,它有两个构造函数,它们都有一个参数,并且根据某些条件我想解析其中一个。举个例子,我有一个类 A,我想要的是基于条件 B 或 C 应该得到解决。
例如:
public class A
{
public A(B bObject)
{...}
public A(C cObject)
{...}
}
Run Code Online (Sandbox Code Playgroud)
但我无法理解如何做到这一点。我尝试做如下的事情:
登记:
builder.RegisterType<A>().
UsingConstructor(typeof(C)).
Named<A>(nameof(C));
builder.RegisterType<A>().
UsingConstructor(typeof(B)).
Named<A>(nameof(B));
Run Code Online (Sandbox Code Playgroud)
解决:
DiContainer.ResolveNamed<A>(nameof(B));
DiContainer.ResolveNamed<A>(nameof(C));
Run Code Online (Sandbox Code Playgroud)
注:我已经在容器中注册了B和C,如下图:
builder.RegisterType<B>();
builder.RegisterType<C>()
Run Code Online (Sandbox Code Playgroud)
我对 AutoFac 有点陌生,我什至不确定这是否是正确的方法,我认为这与我注册两次有关,我不确定。
强烈感谢任何建议或帮助。
您可以尝试使用 Autofac lambda 注册,并使用以下代码片段执行注册(c此处的参数是IComponentContext实例)
var builder = new ContainerBuilder();
builder.Register(
(c, p) =>
{
var condition = p.Named<bool>("condition");
return condition ? new A(c.Resolve<B>()) : new A(c.Resolve<C>());
});
builder.RegisterType<B>();
builder.RegisterType<C>();
Run Code Online (Sandbox Code Playgroud)
A然后通过将参数传递给 lambda 表达式来解析。您可以使用TypedParameter命名(仅限常量值)或ResolvedParameter(动态值)
var a = container.Resolve<A>(new NamedParameter("condition", true));
Run Code Online (Sandbox Code Playgroud)
如果您不想显式调用Resolve,您可以查看委托工厂(Func<T>例如)