10

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

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

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>>();
...

还是有更短的方法?

4

1 回答 1

11

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

因此,以下内容不起作用:

container.Register(typeof(IRepository<>), typeof(AzureRepository<>));

但是,有一种解决方法 - 使注册瞬态:

container.Register(typeof(IRepository<>), typeof(AzureRepository<>)).AsMultiInstance();

这将为每个解析请求创建一个新实例并正确遵守类型参数。这样做的缺点是,每次您使用先前已解析的类型参数请求接口时,您也会获得一个新实例。

编辑

确认的。开放泛型解析确实使用了SingletonFactory,一旦它创建了一个实例,它将始终为后续解析返回它。它不知道也不关心泛型。为了使其正常工作,GenericSingletonFactory需要 a 不仅保留单个实例,而且保留由要解析的具体类型键入的字典。

好吧,这甚至没有那么难解决。我只是对它的了解还不够,无法确定它真的是正确的。

于 2013-03-30T01:51:18.347 回答