使用元数据进行绑定,以便根据环境条件确定绑定

本文关键字:绑定 环境 条件 元数据 | 更新日期: 2023-09-27 18:15:39

我目前使用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();
}

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

中获取特定的IRepo。
Bind<TypeThatUsesTheIRepo>.ToMethod(context => context.Kernel.Get<IRepo>(BasedOnTheCurrentCachingModeforTheRequest));

我个人不介意解决方案,但我不完全确定它是最好的选择,考虑到我想要实现的(在运行时根据环境选择不同的IRepo实现)。

使用元数据进行绑定,以便根据环境条件确定绑定

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

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实现的缓存,而不是一个真正的。