метаданные привязки объекта для определения привязки в зависимости от условий среды - PullRequest
3 голосов
/ 24 ноября 2011

В настоящее время я использую 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();
}

Есть ли лучший способ сделать это?В настоящее время мне нужно привязать тип вызова к методу, чтобы я мог получить конкретное значение IRepo в лямбда ToMethod:

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

Я лично не против решения, но я не совсем уверенлучший вариант, учитывая то, что я пытаюсь достичь (другая реализация IRepo будет выбрана во время выполнения в зависимости от среды).

1 Ответ

4 голосов
/ 24 ноября 2011

В этом случае лучше использовать условие, подобное следующему:

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 реализацию кеша вместо реальной.

...