如何使用TinyIOC注册一个泛型接口



假设我有一个泛型接口和一个泛型实现。我如何登记所有的用法?

具体来说,我有以下内容(简化):

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不仅保留单个实例,而且保留由要解析的具体类型键控的字典。

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

最新更新