【问题标题】:Load multiple bindings with Ninject使用 Ninject 加载多个绑定
【发布时间】:2019-10-15 02:24:43
【问题描述】:

我正在尝试在一个项目的类中加载绑定。我正在为缓存使用 3rd 方扩展,我需要加载的类如下所示,使用 c# 和 .net 框架 472 。

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

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

通常,如果我必须加载,我会使用类似的东西 Bind().To().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();

我需要为沙发底座和存储桶名称提供 Uri,并且逻辑无处不在。任何知识共享将不胜感激。

【问题讨论】:

    标签: c# .net ninject


    【解决方案1】:

    如果 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 对象。然后,您只需注入您创建的工厂类,您就可以在需要时使用工厂类来获取所需的 CouchbaseCache 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多