gpt4 book ai didi

c# - Autofac:使用 in 和 out 类型参数解析变体类型

转载 作者:太空狗 更新时间:2023-10-29 17:55:27 25 4
gpt4 key购买 nike

这个问题是我之前问题的跟进:Autofac: Hiding multiple contravariant implementations behind one composite .

我试图找到我们可以使用 Autofac 的协变和逆变支持做什么的界限。我注意到 Autofac 的 ContravariantRegistrationSource 只支持带有单个通用参数的通用接口(interface),该参数用 in 关键字标记。这似乎限制了这个特性的用处,我想知道 Autofac 是否有其他方法来扩展对协变和逆变的支持。

我必须承认,我问这个问题并不是因为我正在设计一个真实的应用程序。为了教育目的,我故意试图找到 Autofac 的限制。

所以考虑下面的接口(interface):

public interface IConverter<in TIn, out TOut>
{
TOut Convert(TIn value);
}

以及以下实现:

public class ObjectToStringConverter : IConverter<object, string>
{
string IConverter<object, string>.Convert(object value)
{
return value.ToString();
}
}

以及以下注册:

var builder = new ContainerBuilder();

builder.RegisterSource(new ContravariantRegistrationSource());

builder.RegisterType<ObjectToStringConverter>()
.As<IConverter<object, string>>();

var container = builder.Build();

通过这种设计和配置,我希望能够做到这一点:

// This call succeeds because IConverter<object, string> is
// explicitly registered.
container.Resolve<IConverter<object, string>>();

// This call fails, although IConverter<string, object> is
// assignable from IConverter<object, string>.
container.Resolve<IConverter<string, object>>();

或者让我用给定的定义更抽象地说:

public class A { }
public class B : A { }
public class C : B { }

public class AToCConverter : IConverter<A, C> { ... }

以及以下注册:

builder.RegisterType<AToCConverter>()
.As<IConverter<C, A>>();

我希望以下调用能够成功:

container.Resolve<IConverter<C, A>>();
container.Resolve<IConverter<B, B>>();
container.Resolve<IConverter<A, C>>();

我们如何使用 Autofac 做到这一点?

最佳答案

我认为这是一个我们不太可能在 Autofac 中克服的限制,但探索它很有趣。

我们可以进行逆变“解析”,因为给定一个泛型类型参数,我们可以找到该参数可分配给的所有基本/接口(interface)类型。也就是说,给定 string,我们可以搜索 objectIComparable 等的实现。

相反的方向——从一个参数类型到它的所有子类——并不是那么容易。给定 object,我们需要一些方法来查找其他所有内容。

可以使用容器中注册的具体组件的知识,例如扫描所有组件以寻找可能的实现并向后工作,但这对 Autofac 来说不是很好,因为在许多情况下我们依赖“拉”模型来懒惰地创建组件。

希望这是值得深思的,有兴趣看看你的想法。

关于c# - Autofac:使用 in 和 out 类型参数解析变体类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7323789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com