使用元数据进行绑定,以便根据环境条件确定绑定
本文关键字:绑定 环境 条件 元数据 | 更新日期: 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实现的缓存,而不是一个真正的。