【问题标题】:Setting up dotnet core with RavenDB使用 RavenDB 设置 dotnet 核心
【发布时间】:2017-03-30 10:43:21
【问题描述】:

我目前在为多个环境设置带有 dotnet 核心的 RavenDB 时遇到问题。

StartUp 类中,我将 Raven 配置为 Singleton,并使用 IOptions 模式将设置 Raven 绑定到 RavenSettings 对象。

 public virtual void ConfigureServices(IServiceCollection services)
 {
     Services.AddMvc()

     //Add functionality to inject IOptions<T> 
     services.AddOptions();

     // App Settings
     services.Configure<RavenSettings>(Configuration.GetSection("Raven"));
     //services.Configure<RavenSettings>(settings => Configuration.GetSection("Raven").Bind(settings));

     // .NET core built in IOC
     services.AddSingleton(DocumentStoreHolder.Store);
     services.AddSingleton<IConfiguration>(Configuration);
 }

这是我的默认应用设置。

{
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
      }
  },
  "Raven": {
    "Url": "x",
    "DefaultDatabase": "x"
  }
}

这是我尝试将设置从 appsettings 绑定到 ...

的类
public class RavenSettings
{
    public string Url { get; set; }
    public string DefaultDatabase { get; set; }
}

下面的类在生成 Raven 文档存储时遵循 Raven 文档。因为我使用的是单例,所以我没有点击构造函数来注入设置。任何人都可以建议解决此问题的方法吗?

public sealed class DocumentStoreHolder
{
    private static RavenSettings _ravenSettings;

    public DocumentStoreHolder(IOptions<RavenSettings> ravenSettings)
    {
        _ravenSettings = ravenSettings.Value;
    }

    public static IDocumentStore Store => DocStore.Value;

    private static readonly Lazy<IDocumentStore> DocStore = new Lazy<IDocumentStore>(CreateStore);

    private static IDocumentStore CreateStore()
    {
        var store = new DocumentStore
        {
            Url = _ravenSettings.Url,
            DefaultDatabase = _ravenSettings.DefaultDatabase
        }.Initialize();

        return store;
    }
}

【问题讨论】:

    标签: dependency-injection .net-core ravendb


    【解决方案1】:

    基于 Set 的回答,我能够通过创建 IDocumentStoreHolder 接口并在 IOC 中注册它来解决它。

    DocumentStoreHolder.cs

    public class DocumentStoreHolder : IDocumentStoreHolder
    {
        public DocumentStoreHolder(IOptions<RavenSettings> ravenSettings)
        {
            var settings = ravenSettings.Value;
    
            Store = new DocumentStore
            {
                Url = settings.Url,
                DefaultDatabase = settings.DefaultDatabase
            }.Initialize();
        }
    
        public IDocumentStore Store { get; }
    }
    

    IDocumentStoreHolder.cs

    public interface IDocumentStoreHolder
    {
        IDocumentStore Store { get; }
    }
    

    Startup.cs (ConfigureServices)

    services.AddSingleton<IDocumentStoreHolder, DocumentStoreHolder>();
    

    SomeClass.cs

    private readonly IDocumentStore _store;
    
    public SomeClass(IDocumentStoreHolder documentStoreHolder)
    {
        _store = documentStoreHolder.Store;
    }
    

    【讨论】:

      【解决方案2】:

      ASP.NET Core DI 已经使用 singleton 的延迟加载:

      单例生命周期服务在第一次被请求时创建(或者在运行 ConfigureServices 时,如果您在其中指定了一个实例),然后每个后续请求都将使用同一个实例。

      此外:

      如果您的应用程序需要单例行为,建议允许服务容器管理服务的生命周期,而不是实现单例设计模式并自己在类中管理对象的生命周期。

      因此,您可以这样做:

      services.AddSingleton<DocumentStoreHolder>();
      

      通过从 DocumentStoreHolder 类中删除您自己的单例实现

      public sealed class DocumentStoreHolder
      {
          public DocumentStoreHolder(IOptions<RavenSettings> ravenSettings)
          {
              var _ravenSettings = ravenSettings.Value;
      
              Store = new DocumentStore
              {
                  Url = _ravenSettings.Url,
                  DefaultDatabase = _ravenSettings.DefaultDatabase
              }.Initialize();
      
          }
      
          public IDocumentStore Store {get; private set;}
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-10
        • 1970-01-01
        • 2016-05-20
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多