假设我有一个泛型接口和一个泛型实现。我如何登记所有的用法?
具体来说,我有以下内容(简化):
public interface IRepository<T> where T : TableEntity
{
T GetById(string partitionKey, string rowKey);
void Insert(T entity);
void Update(T entity);
void Update(string partitionKey, string rowKey, Action<T> updateAction);
void Delete(T entity);
IQueryable<T> Table { get; }
}
public class AzureRepository<T> : IRepository<T> where T : TableEntity
{
...
}
我是否需要一个接一个地注册所有实现,像这样:
container.Register<IRepository<Entity1>, AzureRepository<Entity1>>();
container.Register<IRepository<Entity2>, AzureRepository<Entity2>>();
container.Register<IRepository<Entity3>, AzureRepository<Entity3>>();
...
还是有更短的路?
正如我在评论中提到的,TinyIoC在Open泛型的解析中有一个错误——它没有将具有不同类型参数的解析实例分开,并且由于默认情况下所有注册都是隐式地使用.AsSingleton()
完成的,因此它总是返回为所有后续解析请求解析的泛型类型的第一个实例。
由于这个原因,下面的代码不能工作:
container.Register(typeof(IRepository<>), typeof(AzureRepository<>));
有一个解决办法,但是-使注册瞬态:
container.Register(typeof(IRepository<>), typeof(AzureRepository<>)).AsMultiInstance();
这将为每个解析请求创建一个新实例,并正确地尊重类型参数。这样做的缺点是,每次使用先前已解析过的类型参数请求接口时,还会得到一个新的实例。
编辑
确认。Open泛型解析确实使用SingletonFactory
,一旦它创建了一个实例,将始终为后续解析返回该实例。它不知道也不关心泛型。为了使其正常工作,需要GenericSingletonFactory
不仅保留单个实例,而且保留由要解析的具体类型键控的字典。
好吧,这一点都不难解决。我只是不太了解它,还不能确定它是否真的都是正确的。