gpt4 book ai didi

c# - Autofac 函数解析

转载 作者:行者123 更新时间:2023-11-30 22:16:23 26 4
gpt4 key购买 nike

我对 Autofac(版本 3.0.2)的 Funcs 解析有疑问。为什么 Autofac 能够为它无法解析的类型返回 Funcs?似乎 Autofac 在执行 func 时正在执行依赖项解析,这似乎是不正确的,应该在创建 Func 时完成(不是创建 Foo 类型,而是确保可以使用已知的注册类型调用其构造函数).

using System;
using Autofac;
using NUnit.Framework;

namespace AutofacTest
{
class Program
{
static void Main(string[] args)
{
var builder = new ContainerBuilder();
builder.RegisterType<Foo>().AsSelf().AsImplementedInterfaces();
var container = builder.Build();

//var foo = container.Resolve<IFoo>(); //Throws because the int arg can't be resolved (as it should)
Assert.True(container.IsRegistered<Func<int, IFoo>>()); //This is valid and makes sense
var fooFunc = container.Resolve<Func<int, IFoo>>();
var foo = fooFunc(9);

//Assert.False(container.IsRegistered<Func<string, IFoo>>()); //Why is this true?
var badFooFunc = container.Resolve<Func<string, IFoo>>(); // Why doesn't Autofac throw here?
var badFoo = badFooFunc(string.Empty); // Autofac throws here
}

}

interface IFoo { }
public class Foo : IFoo
{
public string ArgStr { get; set; }
public Foo(int arg)
{
this.ArgStr = arg.ToString();
}
}

}

最佳答案

根据 this code , 似乎 Func<>实际上是对 Resolve 的编译调用使用 TypedParameter .由于在您调用 Func<> 之前不会调用电话,无法检测调用是否有效以及参数是否可以映射。

我不确定 Autofac 是否提供了一种简单的方法来验证解析的可能性而无需实际解析 — 但这绝对不是一个常见的功能,因此 Func<> 不足为奇不包括那个。

但是,鉴于 Autofac 是开源的,如果您有兴趣,您绝对可以考虑添加该功能。

关于c# - Autofac 函数解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17431942/

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