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;
}