C# Unity-基于泛型类型解析依赖关系

C# Unity-基于泛型类型解析依赖关系,c#,generics,inversion-of-control,unity-container,azure-cosmosdb,C#,Generics,Inversion Of Control,Unity Container,Azure Cosmosdb,我有一个名为DocumentRepository 带构造函数 DocumentDbRepository(IDocumentCollectionName collectionName) 其中,IDocumentCollectionName可以是 CollectionNameFromClassName<T> 我正在通过以下方式解决这个问题: container.RegisterType(typeof(IDocumentDbRepository<ClassA>), type

我有一个名为
DocumentRepository
带构造函数

DocumentDbRepository(IDocumentCollectionName collectionName)
其中,IDocumentCollectionName可以是

CollectionNameFromClassName<T>
我正在通过以下方式解决这个问题:

container.RegisterType(typeof(IDocumentDbRepository<ClassA>), typeof(DocumentDbRepository<ClassA>))

container.RegisterType(typeof(IDocumentDbRepository<ClassB>), typeof(DocumentDbRepository<ClassB>))
container.RegisterType(typeof(IDocumentDbRepository),typeof(DocumentDbRepository))
container.RegisterType(typeof(IDocumentDbRepository),typeof(DocumentDbRepository))
到目前为止还不错

但是现在我想根据泛型类型将IDocumentCollectionName解析为
CollectionNameFromClassName
CollectionNameFromString

因此,如果我有
ClassA
,我希望IDocumentCollectionName解析为
CollectionNameFromClassName

如果我有ClassB,我希望IDocumentCollectionName解析为
CollectionNameFromString
,带有字符串参数值,根据,这可能会起作用:

container.RegisterType<IDocumentCollectionName, CollectionNameFromClassName<ClassA>>("ForClassA");
container.RegisterType<IDocumentCollectionName, CollectionNameFromString>("ForClassB");

container.RegisterType<IDocumentDbRepository<ClassA>, DocumentDbRepository<ClassA>>(new InjectionConstructor(new ResolvedParameter<IDocumentCollectionName>("ForClassA")));
container.RegisterType<IDocumentDbRepository<ClassB>, DocumentDbRepository<ClassB>>(new InjectionConstructor(new ResolvedParameter<IDocumentCollectionName>("ForClassB")));
container.RegisterType(“ForClassA”);
container.RegisterType(“ForClassB”);
RegisterType(新注入构造函数(新解析参数(“ForClassA”));
RegisterType(新注入构造函数(新解析参数(“ForClassB”));
编辑:如果您关心可理解性,我可以向您提出以下建议:

首先,创建一个函数来执行类似于工厂的操作:

void RegisterDocumentDbRepository<TRepository, TCollection>(ContainerType container)
{
    container.RegisterType<IDocumentCollectionName, TCollection>(typeof(TRepository).Name);
    var constructor = new InjectionConstructor(new ResolvedParameter<IDocumentCollectionName>(typeof(TRepository).Name));
    container.RegisterType<IDocumentDbRepository<TRepository>, DocumentDbRepository<TRepository>>(constructor);
}
void RegisterDocumentDbRepository(ContainerType容器)
{
container.RegisterType(typeof(TRepository).Name);
var constructor=newinjectionconstructor(新的ResolvedParameter(typeof(TRepository).Name));
container.RegisterType(构造函数);
}
然后,按如下方式注册您的类型:

RegisterDocumentDbRepository<ClassA, CollectionNameFromClassName<ClassA>>(container);
RegisterDocumentDbRepository<ClassB, CollectionNameFromString>(container);
RegisterDocumentDbRepository(容器);
RegisterDocumentDbRepository(容器);
根据,这可能有效:

container.RegisterType<IDocumentCollectionName, CollectionNameFromClassName<ClassA>>("ForClassA");
container.RegisterType<IDocumentCollectionName, CollectionNameFromString>("ForClassB");

container.RegisterType<IDocumentDbRepository<ClassA>, DocumentDbRepository<ClassA>>(new InjectionConstructor(new ResolvedParameter<IDocumentCollectionName>("ForClassA")));
container.RegisterType<IDocumentDbRepository<ClassB>, DocumentDbRepository<ClassB>>(new InjectionConstructor(new ResolvedParameter<IDocumentCollectionName>("ForClassB")));
container.RegisterType(“ForClassA”);
container.RegisterType(“ForClassB”);
RegisterType(新注入构造函数(新解析参数(“ForClassA”));
RegisterType(新注入构造函数(新解析参数(“ForClassB”));
编辑:如果您关心可理解性,我可以向您提出以下建议:

首先,创建一个函数来执行类似于工厂的操作:

void RegisterDocumentDbRepository<TRepository, TCollection>(ContainerType container)
{
    container.RegisterType<IDocumentCollectionName, TCollection>(typeof(TRepository).Name);
    var constructor = new InjectionConstructor(new ResolvedParameter<IDocumentCollectionName>(typeof(TRepository).Name));
    container.RegisterType<IDocumentDbRepository<TRepository>, DocumentDbRepository<TRepository>>(constructor);
}
void RegisterDocumentDbRepository(ContainerType容器)
{
container.RegisterType(typeof(TRepository).Name);
var constructor=newinjectionconstructor(新的ResolvedParameter(typeof(TRepository).Name));
container.RegisterType(构造函数);
}
然后,按如下方式注册您的类型:

RegisterDocumentDbRepository<ClassA, CollectionNameFromClassName<ClassA>>(container);
RegisterDocumentDbRepository<ClassB, CollectionNameFromString>(container);
RegisterDocumentDbRepository(容器);
RegisterDocumentDbRepository(容器);
我在这里找到了答案

结束代码看起来像

container.RegisterInstance<Func<Type, IDocumentCollectionName>>(type =>
{
    if (type == typeof(ClassA))
        return
            (IDocumentCollectionName)
                container.Resolve(typeof(CollectionNameFromClassName<>).MakeGenericType(type));
    else
        return (IDocumentCollectionName)
            container.Resolve(typeof(CollectionNameFromString));

});

我在这里找到了答案

结束代码看起来像

container.RegisterInstance<Func<Type, IDocumentCollectionName>>(type =>
{
    if (type == typeof(ClassA))
        return
            (IDocumentCollectionName)
                container.Resolve(typeof(CollectionNameFromClassName<>).MakeGenericType(type));
    else
        return (IDocumentCollectionName)
            container.Resolve(typeof(CollectionNameFromString));

});


可能重复的可能重复的可能重复的不起作用。我试过了,但我不太喜欢。但我认为使用工厂方法效果更好。它更容易阅读。那么这个编辑对你有好处吗?它确实有用。我试过了,但我不太喜欢。但我认为使用工厂方法效果更好。它更容易阅读。那么这个编辑对你有好处吗?