Загрузите несколько привязок с Ninject - PullRequest
2 голосов
/ 29 мая 2019

Я пытаюсь загрузить привязки в классе для проекта. Я использую сторонние расширения для кэширования, и класс, который мне нужно загрузить, выглядит следующим образом, используя c # и .net framework 472.

public class CouchbaseCache : ICouchbaseCache, IDistributedCache
{
    public CouchbaseCache(ICouchbaseCacheBucketProvider provider, IOptions<CouchbaseCacheOptions> options);

    public IBucket Bucket { get; }
    public CouchbaseCacheOptions Options { get; }
}

обычно, если мне нужно загрузить, я бы использовал что-то вроде .. Bind () К () InSingletonScope ();

Но как бы я сделал это для вышеуказанного класса, предоставив информацию о корзине и Опции в качестве значений при загрузке? Я не мог обдумать это.

Кроме того, ICouchbaseCachebucketProvider - это интерфейс, производный от INamedbucketProvider, а производный класс выглядит как

public interface INamedBucketProvider
{
    string BucketName { get; }

    IBucket GetBucket();
}

Пока мне удалось настроить CouchbaseClientDefinition следующим образом

Bind<ICouchbaseClientDefinition>().ToMethod(ctx =>
{
      var options = new CouchbaseClientDefinition
      {
           Servers = new List<Uri>
           {
                new Uri("http://couchbase.com/")
            }
       };
       return options;
 }).InSingletonScope();

Мне нужно дать Ури для дивана, а также имя ведра, и логика повсюду. Любой обмен знаниями будет принята с благодарностью.

1 Ответ

0 голосов
/ 07 июня 2019

если аргумент для конструктора CouchbaseCache идентичен в течение всего времени жизни приложения, то вы можете связать его с помощью связывания с аргументами конструктора примерно так, как вы загружаете:

    var options = new CouchbaseClientDefinition
      {
           Servers = new List<Uri>
           {
                new Uri("http://couchbase.com/")
            }
       };
    var couchbaseCacheBucketProvider= new CouchbaseCacheBucketProvider
    {
        ...
    };



 Bind<ICouchbaseClientDefinition().To<CouchbaseCache >()
            .WithConstructorArgument(couchbaseCacheBucketProvider, options);

но вы должны предоставить couchbaseCacheBucketProvider.

если аргументы различны, но они ограничены, например, если у вас есть две версии аргументов, вы можете использовать именованную привязку, как это

           var options1 = new CouchbaseClientDefinition
            {
                ...
            };

            var options2 = new CouchbaseClientDefinition
            {
                ...
            };

            var couchbaseCacheBucketProvider1= new CouchbaseCacheBucketProvider
            {
                ...
            };
            var couchbaseCacheBucketProvider2= new CouchbaseCacheBucketProvider
            {
                ...
            };



            Bind < ICouchbaseClientDefinition().To<CouchbaseCache>().WithConstructorArgument(couchbaseCacheBucketProvider, options1).Named("FirstBinding");
            Bind < ICouchbaseClientDefinition().To<CouchbaseCache>().WithConstructorArgument(couchbaseCacheBucketProvider, options2).Named("SecondBinding");

Однако другой альтернативой является использование FactoryPattern / Singleton для создания вашего объекта CouchbaseCache. Затем вам нужно просто внедрить созданный вами класс Factory, и вы можете использовать класс Factory, чтобы получить требуемый объект CouchbaseCache, когда это потребуется.

...