ninject binding withmetadata用于根据环境条件确定绑定

时间:2011-11-24 06:21:58

标签: c# dependency-injection ninject

我目前正在使用WithMetaData将绑定的缓存模式附加到存储库,如下所示:

Bind<IRepo>().To<CachedRepo>().WithMetaData(MetadataKeys.RepoKey, CacheMode.Cached);
Bind<IRepo>().To<Repo>().WithMetaData(MetadataKeys.RepoKey, CacheMode.NotCached);

static CacheMode GetTheCurrentCacheMode()
{
    //returns a CacheMode based on some environmental settings
}

statuc Func<IBindingMetadata, bool> BasedOnTheCurrentCachingModeforTheRequest()
{
    return meta => meta.Has(MetadataKeys.RepoKey)
                   meta.Get<CacheMode>(MetadataKeys.RepoKey) == GetTheCurrentCacheMode();
}

有更好的方法吗?目前我必须将调用类型绑定到一个方法,所以我可以在ToMethod lambda中获取特定的IRepo:

Bind<TypeThatUsesTheIRepo>.ToMethod(context => context.Kernel.Get<IRepo>(BasedOnTheCurrentCachingModeforTheRequest));

我个人并不介意解决方案,但我并不完全确定它是最佳选择,因为我正在努力实现(根据环境在运行时选择不同的IRepo实现)。

1 个答案:

答案 0 :(得分:4)

在这种情况下,最好使用这样的条件:

Bind<IRepo>().To<CachedRepo>().When(_ => GetTheCurrentCacheMode() == CacheMode.Cached);
Bind<IRepo>().To<Repo>().When(_ => GetTheCurrentCacheMode() == CacheMode.NotCached);

或添加扩展方法:

IBindingInNamedWithOrOnSyntax<T> WhenCachingModeIs<T>(
    this IBindingWhenSyntax<T> syntax,
    CacheMode cacheMode)
{
    return syntax.When(_ => GetTheCurrentCacheMode() == cacheMode);
}

Bind<IRepo>().To<CachedRepo>().WhenCachingModeIs(CacheMode.Cached);
Bind<IRepo>().To<Repo>().WhenCachingModeIs(CacheMode.NotCached);

另一种方法是使用相同的存储库实现并将ICache注入其中。在您不想缓存的情况下,请注入缓存的Null实现而不是真实缓存。