首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在autofac中注册ImmutableArray

在autofac中注册ImmutableArray
EN

Stack Overflow用户
提问于 2020-01-07 14:36:01
回答 1查看 35关注 0票数 1

Autofac允许您使用RegisterGeneric方法注册泛型类型。

我想注册ImmutableArray<T>

我想要的语义与IEnumerable<T>相同-即Autofac应该创建一个包含所有T注册的ImmutableArray<T>实例。

如果这是非通用的,那就很简单了:

代码语言:javascript
复制
builder.Register<ImmutableArray<string>>(c => c.Resolve<IEnumerable<string>>().ToImmutableArray());

然而,对于泛型类型,我看不到任何方法。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-01-10 17:26:41

使用lambda表达式注册泛型方法没有简单的方法。为此,您需要使用具有泛型类型操作的IRegistrationSource

大概是这样的:

代码语言:javascript
复制
public class ImmutableArrayRegistrationSource : IRegistrationSource
{
    public bool IsAdapterForIndividualComponents => false;

    private static MethodInfo toImmutableArrayMethod =
            typeof(ImmutableArray)
                .GetMethods()
                .Where(m => m.Name == nameof(ImmutableArray.ToImmutableArray)
                            && m.GetParameters().Any(p => p.ParameterType.GetGenericTypeDefinition() == typeof(IEnumerable<>)))
                .FirstOrDefault();

    public IEnumerable<IComponentRegistration> RegistrationsFor(Service service, Func<Service, IEnumerable<IComponentRegistration>> registrationAccessor)
    {
        IServiceWithType typedService = service as IServiceWithType;

        if (typedService != null && typedService.ServiceType.IsClosedTypeOf(typeof(ImmutableArray<>)))
        {
            Type elementType = typedService.ServiceType.GetGenericArguments()[0];

            IComponentRegistration r = RegistrationBuilder.ForDelegate(typedService.ServiceType, (c, p) =>
            {
                Object elements = c.Resolve(typeof(IEnumerable<>).MakeGenericType(elementType));
                Object immutableArray = toImmutableArrayMethod.MakeGenericMethod(elementType)
                                                              .Invoke(null, new Object[] { elements });

                return immutableArray;
            }).As(service)
              .CreateRegistration();

            yield return r;
        }
        yield break;
    }
}

然后注册您的注册源:

代码语言:javascript
复制
builder.RegisterSource<ImmutableArrayRegistrationSource>();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59623353

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档