gpt4 book ai didi

autofac - 如何在 AutoFac 上使用内部构造函数解析公共(public)类

转载 作者:行者123 更新时间:2023-12-01 16:17:07 31 4
gpt4 key购买 nike

我有这个类要在单元测试中实例化:

public class Customer
{
internal Customer(Guid id) {
// initialize property
}
}

如果我使用 new Customer() 从另一个(单元测试)程序集中实例化测试类,则可以工作,因为我添加了 [程序集:InternalsVisibleTo("MyProject.Tests")]

var sut = new Customer(Guid.NewGuid()); // works

但是当我在另一个(单元测试)程序集中设置 autofac 容器时

var builder = new ContainerBuilder();
builder.RegisterType<Customer>().AsSelf();
var container = builder.Build();

我无法使用 autofac 进行解析。

var theParam = new NamedParameter("id", Guid.NewGuid());
_sut = container.Resolve<Customer>(theParam); // throws exception

我最好的猜测是内部构造函数不可用。但是在另一个旁边添加 [assemble: InternalsVisibleTo("Autofac")] 并没有帮助。

Autofac 抛出的异常是

Autofac.Core.DependencyResolutionException: 
An error occurred during the activation of a particular registration. See the inner exception for details.
Registration: Activator = Customer (ReflectionActivator),
Services = [MyProject.Customer],
Lifetime = Autofac.Core.Lifetime.CurrentScopeLifetime,
Sharing = None,
Ownership = OwnedByLifetimeScope
---> No accessible constructors were found for the type 'MyProject.Customer'.

Autofac 不能处理内部构造函数吗?

最佳答案

Autofac 无法找到非公共(public)构造函数,因为它使用 DefaultConstructorFinder默认情况下仅搜索公共(public)构造函数的类。

您必须像这样创建 IConstructorFinder 接口(interface)的自定义实现:

public class AllConstructorFinder : IConstructorFinder 
{
private static readonly ConcurrentDictionary<Type, ConstructorInfo[]> Cache =
new ConcurrentDictionary<Type, ConstructorInfo[]>();


public ConstructorInfo[] FindConstructors(Type targetType)
{
var result = Cache.GetOrAdd(targetType,
t => t.GetTypeInfo().DeclaredConstructors.Where(c => !c.IsStatic).ToArray());

return result.Length > 0 ? result : throw new NoConstructorsFoundException(targetType);
}
}

然后您必须在类型注册上使用 FindConstructorsWith 扩展方法:

builder.RegisterType<Customer>()
.FindConstructorsWith(new AllConstructorFinder())
.AsSelf();

InternalsVisibleToAttribute 在这种情况下无济于事,因为它只影响编译时间。

关于autofac - 如何在 AutoFac 上使用内部构造函数解析公共(public)类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52793062/

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