C# 有没有一种干净的方法可以在Autofac中构建泛型类型参数?

C# 有没有一种干净的方法可以在Autofac中构建泛型类型参数?,c#,generics,autofac,C#,Generics,Autofac,我一直在尝试将泛型对象数组注入泛型类型的构造函数,但找不到一种干净的方法 我的课程如下: public sealed class RepositoryConsumer<T> : IRepositoryConsumer<T> Where T : BaseEntity { private readonly IOtherDependency _otherDependency; private readonly IReadOnlyCollection<IRepo

我一直在尝试将泛型对象数组注入泛型类型的构造函数,但找不到一种干净的方法

我的课程如下:

public sealed class RepositoryConsumer<T> : IRepositoryConsumer<T> Where T : BaseEntity
{
   private readonly IOtherDependency _otherDependency;
   private readonly IReadOnlyCollection<IRepository<T>> _regionalRepositories;

   public RepositoryConsumer<T>(
      IOtherDependency otherDependency,
      IReadOnlyCollection<IRepository<T>> regionalRepositories)
   {
      _otherDependency = otherDependency;
      _regionalRepositories = regionalRepositories;
   }
...

有没有人有更好/更干净的方法来实现这一点?我不喜欢动态调用其中的方法。

CreateRepositories
中,您在哪里使用
t
?你是说
context.Resolve
?它将位于
RepositoryProvider.Create()
。我将修改示例。您应该能够创建自己的
IRegistrationSource
来提供
IReadOnlyCollection
。这样,您就不必使用
with parameter
方法,Autofac在需要解析
IReadOnlyCollection
时将使用自定义注册源,因此即使使用自定义注册源,您也必须从非通用上下文调用
Create
。要轻松地将它们混合在通用和非通用上下文中,您可以引入一个非通用
IRepositoryProvider
接口和一个通用
IRepositoryProvider

private void BindRepositoryConsumers(ContainerBuilder builder)
        {
            builder.RegisterGeneric(typeof(IRepository<>)).As(typeof(IRepository<>));
            builder.RegisterGeneric(typeof(RepositoryConsumer<>))
                .As(typeof(IRepositoryConsumer<>))
                .WithParameter(
                    (parameter, context) => ParameterTypeIsReadonlyCollectionOfIRepositories(parameter),
                    (parameter, context) =>
                    {
                        var type = parameter.ParameterType.GenericTypeArguments.First().GenericTypeArguments.First();
                        return GetType()
                            .GetMethod(nameof(CreateRepositories))
                            .MakeGenericMethod(type)
                            .Invoke(this, BindingFlags.Default, null, new object[] { context }, CultureInfo.InvariantCulture);
                    }).SingleInstance();
        }

        private static bool ParameterTypeIsReadonlyCollectionOfRepositories(ParameterInfo parameter)
        {
            return parameter.ParameterType.IsGenericType &&
                   parameter.ParameterType.GetGenericArguments().First().IsGenericType &&
                   typeof(IReadOnlyCollection<>)
                       .MakeGenericType(typeof(IRepository<>).MakeGenericType(parameter.ParameterType.GenericTypeArguments.First().GenericTypeArguments.First()))
                       .IsAssignableFrom(parameter.ParameterType);
        }

        public static IReadOnlyCollection<IRepository<T>> CreateRepositories<T>(IComponentContext context) where T : BaseEntity
        {
            var repositoryProvider = context.Resolve<IRepositoryProvider>();
            var config = context.Resolve<IConfig>();

            var regionalRepositories = config.Regions.Select(region => repositoryProvider.Create<T>(region));

            return regionalRepositories;
        }