使用Ninject

时间:2019-05-29 12:52:37

标签: c# .net ninject

我正在尝试在项目的类中加载绑定。我正在使用第三方扩展进行缓存,并且需要使用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()。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加上沙发名称和存储桶名称,并且逻辑无处不在。任何知识共享将不胜感激。

1 个答案:

答案 0 :(得分:0)

如果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对象。