Autofac 解析具有不同参数的同一类实例

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 有点陌生,我什至不确定这是否是正确的方法,我认为这与我注册两次有关,我不确定。

强烈感谢任何建议或帮助。

Pav*_*ski 1

您可以尝试使用 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>例如)