Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用TinyIOC注册通用接口_C#_.net_Generics_Inversion Of Control_Tinyioc - Fatal编程技术网

C# 如何使用TinyIOC注册通用接口

C# 如何使用TinyIOC注册通用接口,c#,.net,generics,inversion-of-control,tinyioc,C#,.net,Generics,Inversion Of Control,Tinyioc,假设我有一个通用接口和一个通用实现。如何注册所有用法 具体来说,我有以下几点(为了简单起见减少): 公共接口i位置,其中T:TableEntity { T GetById(stringpartitionkey,stringrowkey); 无效插入(T实体); 无效更新(T实体); 无效更新(string partitionKey、string rowKey、Action updateAction); 无效删除(T实体); IQueryable表{get;} } 公共类AzureReposito

假设我有一个通用接口和一个通用实现。如何注册所有用法

具体来说,我有以下几点(为了简单起见减少):

公共接口i位置,其中T:TableEntity
{
T GetById(stringpartitionkey,stringrowkey);
无效插入(T实体);
无效更新(T实体);
无效更新(string partitionKey、string rowKey、Action updateAction);
无效删除(T实体);
IQueryable表{get;}
}
公共类AzureRepository:IRepository其中T:TableEntity
{
...
}
我是否需要逐个注册所有实现,如下所示:

container.Register<IRepository<Entity1>, AzureRepository<Entity1>>();
container.Register<IRepository<Entity2>, AzureRepository<Entity2>>();
container.Register<IRepository<Entity3>, AzureRepository<Entity3>>();
...
container.Register();
container.Register();
container.Register();
...

还是有一个更短的方法?

正如我在评论中提到的,TinyIoC在解决开放泛型时有一个缺陷-它不会将具有不同类型参数的已解决实例分开,并且由于默认情况下所有注册都是通过
.AsSingleton()
隐式完成的,它总是返回为所有后续解析请求解析的泛型类型的第一个实例

因此,以下操作不起作用:

container.Register(typeof(IRepository<>), typeof(AzureRepository<>));
container.Register(typeof(IRepository)、typeof(AzureRepository));
但是,有一个解决方法-使注册暂时:

container.Register(typeof(IRepository<>), typeof(AzureRepository<>)).AsMultiInstance();
container.Register(typeof(IRepository)、typeof(AzureRepository)).AsMultiInstance();
这将为每个解析请求创建一个新实例,并正确地使用type参数。这样做的缺点是,每次使用之前已解析的类型参数请求接口时,都会得到一个新实例

编辑

确认。Open Generics resolution确实使用了
SingletonFactory
,一旦创建了实例,它将始终返回该实例以用于后续解析。它不知道也不关心泛型。要使其正常工作,需要一个
GenericSingletonFactory
,它不仅保留一个实例,还保留一个由待解析的具体类型键入的字典


好吧,这都不难解决。我只是不太了解它,还不能确定它是否真的正确。

这就是你要找的吗?否-在本例中,它将所有IRepository依赖项(IR、IR等)注册为AzureRepository。我可以确认这一行为(在v1.2中)-但这显然是一个bug。
container.Register(typeof(IRepository<>), typeof(AzureRepository<>)).AsMultiInstance();