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