我目前正在使用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实现)。
答案 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实现而不是真实缓存。