Parcourir la source

Add external Settings from configuration file.

Dalibor Votruba il y a 3 ans
Parent
commit
f767d9684c

+ 15 - 0
Common/qdr.app.qlbrc.common/Attributes/DbContextModuleAssignmentAttribute.cs

@@ -0,0 +1,15 @@
+namespace Quadarax.Application.QLiberace.Common.Attributes
+{
+    [AttributeUsage(AttributeTargets.Class)]
+    public class DbContextModuleAssignmentAttribute : Attribute
+    {
+        public string ModuleCode { get; set; }
+
+        public DbContextModuleAssignmentAttribute(string moduleCode)
+        {
+            if (string.IsNullOrEmpty(moduleCode)) throw new ArgumentNullException(nameof(moduleCode));
+
+            ModuleCode = moduleCode;
+        }
+    }
+}

+ 16 - 0
Common/qdr.app.qlbrc.common/Attributes/ModuleAttribute.cs

@@ -0,0 +1,16 @@
+namespace Quadarax.Application.QLiberace.Common.Attributes
+{
+
+    [AttributeUsage(AttributeTargets.Class)]
+    public class ModuleAttribute : Attribute
+    {
+        public string ModuleCode { get; set; }
+
+        public ModuleAttribute(string moduleCode)
+        {
+            if (string.IsNullOrEmpty(moduleCode)) throw new ArgumentNullException(nameof(moduleCode));
+
+            ModuleCode = moduleCode;
+        }
+    }
+}

+ 0 - 7
Common/qdr.app.qlbrc.common/Class1.cs

@@ -1,7 +0,0 @@
-namespace qdr.app.qlbrc.common
-{
-    public class Class1
-    {
-
-    }
-}

+ 42 - 0
Common/qdr.app.qlbrc.common/Configuration/OlbrcConfiguration.cs

@@ -0,0 +1,42 @@
+using System.IO.Abstractions;
+using System.Reflection;
+using System.Text.Json;
+
+namespace Quadarax.Application.QLiberace.Common.Configuration
+{
+    public static class OlbrcConfiguration
+    {
+
+        public static IFileSystem FileSystem { get; set; }
+        public static string ConfigurationFileName{ get; set; }
+
+        static OlbrcConfiguration()
+        {
+            FileSystem = new FileSystem();
+            ConfigurationFileName = "qlbrc.json";
+        }
+
+        public static Settings? Get()
+        {
+            if (!FileSystem.File.Exists(ConfigurationFileName))
+                return null;
+
+            return JsonSerializer.Deserialize<Settings>(FileSystem.File.ReadAllText(ConfigurationFileName));
+        }
+        public static ModuleConfiguration Get(string moduleName)
+        {
+            var result = Get();
+            if (result == null)
+                throw new InvalidOperationException(
+                    $"Cannot obtain configuration from file '{ConfigurationFileName}'.");
+            var module = result.Modules.FirstOrDefault(x =>
+                string.Equals(x.Code, moduleName, StringComparison.InvariantCultureIgnoreCase));
+            if (module==null)
+                throw new InvalidOperationException(
+                    $"Module '{moduleName}' not found in configuration file '{ConfigurationFileName}'.");
+
+            return module;
+        }
+
+    }
+}

+ 26 - 0
Common/qdr.app.qlbrc.common/Configuration/Settings.cs

@@ -0,0 +1,26 @@
+using System.Reflection;
+using System.Text.Json.Serialization;
+
+namespace Quadarax.Application.QLiberace.Common.Configuration
+{
+    public class Settings
+    {
+
+        [JsonPropertyName("modules")]
+        public IList<ModuleConfiguration> Modules { get; set; }
+
+        public Settings()
+        {
+            Modules = new List<ModuleConfiguration>();
+        }
+    }
+
+
+    public class ModuleConfiguration
+    {
+        [JsonPropertyName("code")]
+        public string Code { get; set; }
+        [JsonPropertyName("connection-string")]
+        public string ConnectionString { get; set; }
+    }
+}

+ 10 - 0
Modules/qdr.app.qlbrc.base/Module.cs

@@ -0,0 +1,10 @@
+using Quadarax.Application.QLiberace.Common.Attributes;
+
+namespace Quadarax.Application.QLiberace.Base
+{
+
+    [Module(Constants.Modules.Base.Code)]
+    public class Module
+    {
+    }
+}

+ 13 - 1
Modules/qdr.app.qlbrc.base/QlbrcDbContext.cs

@@ -1,8 +1,12 @@
 using Microsoft.EntityFrameworkCore;
 using Quadarax.Application.QLiberace.Base.Entities;
+using Quadarax.Application.QLiberace.Common.Attributes;
+using Quadarax.Application.QLiberace.Common.Configuration;
+using Quadarax.Foundation.Core.Reflection;
 
 namespace Quadarax.Application.QLiberace.Base
 {
+    [DbContextModuleAssignment(Constants.Modules.Base.Code)]
     public class QlbrcDbContext : DbContext
     {
 
@@ -26,9 +30,17 @@ namespace Quadarax.Application.QLiberace.Base
 
         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
         {
-            optionsBuilder.UseSqlServer(@"Data Source=(localdb)\MSSQLLocalDB;Initial Catalog=QLiberace;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False");
+            optionsBuilder.UseSqlServer(GetConnectionString());
         }
 
+        private string GetConnectionString()
+        {
+            var attr = AttributeQuery<DbContextModuleAssignmentAttribute>.Get(typeof(QlbrcDbContext));
+            if (attr == null)
+                throw new InvalidOperationException($"No connection string defined for DbContext {this.GetType().Name} or DbContextModuleAssignment is missing.");
+
+            return OlbrcConfiguration.Get(attr.ModuleCode).ConnectionString;
+        }
 
     }
 }

+ 3 - 0
qdr.app.qlbrc.console/qdr.app.qlbrc.console.csproj

@@ -23,6 +23,9 @@
   </ItemGroup>
 
   <ItemGroup>
+    <None Update="qlbrc.json">
+      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
+    </None>
     <None Update="readme.txt">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>

+ 8 - 0
qdr.app.qlbrc.console/qlbrc.json

@@ -0,0 +1,8 @@
+{
+  "modules": [
+    {
+      "code": "base",
+      "connection-string": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=QLiberace;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False"
+    }
+  ]
+}