Skip to content

Repository files navigation

Custom Configurations:

Custom configurations is designed to reduce the repeative lines of code needed to get configuration settings into your application. If there are 5 or 50 settings there doesn't need any extra code to get your settings. It allows the application to simplify the use of configuration settings.

A simple but effective use is to have an object with N number of properties, such as:

publicclassMyAppSettings{publicstringName{get;set;}publicstringLocation{get;set;}publicboolShouldDoX{get;set;}publicintminValue{get;set;}}

Then use the configuration loader to populate the values:

MyAppSettingsappSettings=newCustomConfigurations.Config().Create<MyAppSettings>();

Lets give a simple strongly typed example, lets say we have the following configuration file:

<?xml version="1.0"?>
<configuration>
<configSections>
<sectionname="domainModelTemplate"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations"/>
</configSections>
<domainModelTemplate>
<Configs>
<ConfigurationGroupname="model">
<ValueItems>
<ValueItemkey="CanExecute"value="true"/>
<ValueItemkey="Description"value="domain model template desciption field"/>
<ValueItemkey="NumberUnits"value="5"/>
<ValueItemkey="ModelType"value="TheirType"/>
</ValueItems>
</ConfigurationGroup>
</Configs>
</domainModelTemplate>
<startup><supportedRuntimeversion="v2.0.50727"/></startup></configuration>

We want to load this model into memory:

publicclassDomainModel{publicstringName{get;set;}publicboolCanExecute{get;set;}publicstringDescription{get;set;}publicintNumberUnits{get;set;}publicDomainModelTypeModelType{get;set;}}publicenumDomainModelType{MyType,TheirType,AnotherType,}

We can create a configuration load to isolate the use of custom configuration and simply return a strongly typed object to your business logic:

publicstaticclassConfigurationLoader{publicstaticDomainModelLoadDomainModelTemplate(){returnnewConfig("domainModelTemplate").GetSection("model").Create<DomainModel>();}}

Multipe sections example

Another example is when the app has multiple clients settings to be recorded a section for each can be defined and the values seperated out. The config class allows easy access to a clients configuration and deals with the configuration hooking up in the background for you.

At this point it is not possible to save back to the configuration file. I have tried to get this to work across the board but failed misserably, will try to tackle this again at a later stage, (there are a few commented out sections and tests aimed at this in the committed code).

Here is an example configuration file:

<configuration>
<configSections>
<sectionname="testsection2"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
<sectionGroupname="myCustomGroup">
<sectionname="mysection"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
</sectionGroup>
</configSections>
<myCustomGroup>
<mysection>
<Configs>
<ConfigurationGroupname="client1">
<ValueItems>
<ValueItemkey="key2"value="value2" />
<ValueItemkey="key3"value="value3" />
<ValueItemkey="key4"value="value4" />
<ValueItemkey="key5"value="7" />
<ValueItemkey="key6"value="0.6" /> </ConfigurationGroup>
<ConfigurationGroupname="client2">
<ValueItems>
<ValueItemkey="keya"value="abc" />
<ValueItemkey="key2"value="123" />
</ValueItems>
</ConfigurationGroup>
</Configs>
</mysection>
</myCustomGroup>
<testsection2>
<Configs>
<ConfigurationGroupname="clienta">
<ValueItems>
<ValueItemkey="key2"value="valueabc" /> </ValueItems> </ConfigurationGroup>
</Configs>
</testsection2>
</configuration>
CustomConfigurations.ConfigConfigloader=newCustomConfigurations.Config("client2");

About the examples

The console application "ExampleApp" shows the different ways the customConfiguration application can be used. The examples include:

  • Simply loading the configuration settings and manually getting a setting from it, (SimpleLoadingOfConfiguration.cs)
  • Showing how the application will try and determine the custom section in the config file so you do not have to explicity declare it everytime (LoadingOfConfigurationByAllowingAppToDetermineConfigPath.cs).
  • How to load multiple configuration sections at one time (LoadingMultipleConfigSections.cs)
  • How to create more complex data structures in config, using inner collections (UsingInnerCollections.cs)
  • How to load a different configuration file (LoadingAConfigFileThatIsNotTheDefaultConfig.cs)
  • How to generate strongly typed objects automatically (ExampleApp.MoreComplexExamples.AutoGenerateModelsFromConfig)
  • How to map configuration settings keys to the strongly typed object that have different property names (ExampleApp.MoreComplexExamples.MappingFieldsAutoGen)

Encrypting and decrypting

If required the whole configuration section can be encrypted. The enryption can be used by multiple machines, (no machine key files used). The encryption uses Triple-DES with a key file. The first time it is to be used the key file needs to be generated.

Configconfig=newConfig();config.CreateConfigKey();

There are two ways to encrypt the configuration.

Configconfig=newConfig();config.EncryptConfigurationSection();

This will encrypt all custom config sections in the configuration file.

Configconfig=newConfig();config.EncryptConfigurationSection("sectionName");

To be able to do the encyption and decryption there is one addition to the configuration file:

 <configProtectedData>
<providers>
<addname="TripleDESProtectedConfigurationProvider"type="CustomConfigurations.TripleDESProtectedConfigurationProvider, CustomConfigurations"keyFilePath="configkey.txt" />
</providers>
</configProtectedData>

This will only encrypt the configuration section with the name "sectionName".

Thanks


N.B. all config sections are case sensitive, be careful how you write the xml and using the selectors.

About

a C# configuration Manager handler to allow for multiple clients settings to exists and be easily accessed via custom configuration settings

Resources

Stars

9 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Add copy buttons to all
 blocks
(function() {
function addCopyButtons() {
document.querySelectorAll('pre code').forEach(function(codeBlock) {
if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;
codeBlock.parentElement.setAttribute('data-copy-added', 'true');
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';
btn.onmouseover = function() { this.style.opacity = '1'; };
btn.onmouseout = function() { this.style.opacity = '0.7'; };
btn.onclick = function() {
navigator.clipboard.writeText(codeBlock.textContent).then(function() {
btn.textContent = 'Copied!';
setTimeout(function() { btn.textContent = 'Copy'; }, 1500);
});
};
codeBlock.parentElement.style.position = 'relative';
codeBlock.parentElement.appendChild(btn);
});
}
addCopyButtons();
// Re-run on dynamic content
var observer = new MutationObserver(addCopyButtons);
observer.observe(document.body, { childList: true, subtree: true });
})();
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
GitHub - twistedtwig/CustomConfigurations: a C# configuration Manager handler to allow for multiple clients settings to exists and be easily accessed via custom configuration settings · GitHub
Skip to content

Repository files navigation

Custom Configurations:

Custom configurations is designed to reduce the repeative lines of code needed to get configuration settings into your application. If there are 5 or 50 settings there doesn't need any extra code to get your settings. It allows the application to simplify the use of configuration settings.

A simple but effective use is to have an object with N number of properties, such as:

publicclassMyAppSettings{publicstringName{get;set;}publicstringLocation{get;set;}publicboolShouldDoX{get;set;}publicintminValue{get;set;}}

Then use the configuration loader to populate the values:

MyAppSettingsappSettings=newCustomConfigurations.Config().Create<MyAppSettings>();

Lets give a simple strongly typed example, lets say we have the following configuration file:

<?xml version="1.0"?>
<configuration>
<configSections>
<sectionname="domainModelTemplate"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations"/>
</configSections>
<domainModelTemplate>
<Configs>
<ConfigurationGroupname="model">
<ValueItems>
<ValueItemkey="CanExecute"value="true"/>
<ValueItemkey="Description"value="domain model template desciption field"/>
<ValueItemkey="NumberUnits"value="5"/>
<ValueItemkey="ModelType"value="TheirType"/>
</ValueItems>
</ConfigurationGroup>
</Configs>
</domainModelTemplate>
<startup><supportedRuntimeversion="v2.0.50727"/></startup></configuration>

We want to load this model into memory:

publicclassDomainModel{publicstringName{get;set;}publicboolCanExecute{get;set;}publicstringDescription{get;set;}publicintNumberUnits{get;set;}publicDomainModelTypeModelType{get;set;}}publicenumDomainModelType{MyType,TheirType,AnotherType,}

We can create a configuration load to isolate the use of custom configuration and simply return a strongly typed object to your business logic:

publicstaticclassConfigurationLoader{publicstaticDomainModelLoadDomainModelTemplate(){returnnewConfig("domainModelTemplate").GetSection("model").Create<DomainModel>();}}

Multipe sections example

Another example is when the app has multiple clients settings to be recorded a section for each can be defined and the values seperated out. The config class allows easy access to a clients configuration and deals with the configuration hooking up in the background for you.

At this point it is not possible to save back to the configuration file. I have tried to get this to work across the board but failed misserably, will try to tackle this again at a later stage, (there are a few commented out sections and tests aimed at this in the committed code).

Here is an example configuration file:

<configuration>
<configSections>
<sectionname="testsection2"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
<sectionGroupname="myCustomGroup">
<sectionname="mysection"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
</sectionGroup>
</configSections>
<myCustomGroup>
<mysection>
<Configs>
<ConfigurationGroupname="client1">
<ValueItems>
<ValueItemkey="key2"value="value2" />
<ValueItemkey="key3"value="value3" />
<ValueItemkey="key4"value="value4" />
<ValueItemkey="key5"value="7" />
<ValueItemkey="key6"value="0.6" /> </ConfigurationGroup>
<ConfigurationGroupname="client2">
<ValueItems>
<ValueItemkey="keya"value="abc" />
<ValueItemkey="key2"value="123" />
</ValueItems>
</ConfigurationGroup>
</Configs>
</mysection>
</myCustomGroup>
<testsection2>
<Configs>
<ConfigurationGroupname="clienta">
<ValueItems>
<ValueItemkey="key2"value="valueabc" /> </ValueItems> </ConfigurationGroup>
</Configs>
</testsection2>
</configuration>
CustomConfigurations.ConfigConfigloader=newCustomConfigurations.Config("client2");

About the examples

The console application "ExampleApp" shows the different ways the customConfiguration application can be used. The examples include:

  • Simply loading the configuration settings and manually getting a setting from it, (SimpleLoadingOfConfiguration.cs)
  • Showing how the application will try and determine the custom section in the config file so you do not have to explicity declare it everytime (LoadingOfConfigurationByAllowingAppToDetermineConfigPath.cs).
  • How to load multiple configuration sections at one time (LoadingMultipleConfigSections.cs)
  • How to create more complex data structures in config, using inner collections (UsingInnerCollections.cs)
  • How to load a different configuration file (LoadingAConfigFileThatIsNotTheDefaultConfig.cs)
  • How to generate strongly typed objects automatically (ExampleApp.MoreComplexExamples.AutoGenerateModelsFromConfig)
  • How to map configuration settings keys to the strongly typed object that have different property names (ExampleApp.MoreComplexExamples.MappingFieldsAutoGen)

Encrypting and decrypting

If required the whole configuration section can be encrypted. The enryption can be used by multiple machines, (no machine key files used). The encryption uses Triple-DES with a key file. The first time it is to be used the key file needs to be generated.

Configconfig=newConfig();config.CreateConfigKey();

There are two ways to encrypt the configuration.

Configconfig=newConfig();config.EncryptConfigurationSection();

This will encrypt all custom config sections in the configuration file.

Configconfig=newConfig();config.EncryptConfigurationSection("sectionName");

To be able to do the encyption and decryption there is one addition to the configuration file:

 <configProtectedData>
<providers>
<addname="TripleDESProtectedConfigurationProvider"type="CustomConfigurations.TripleDESProtectedConfigurationProvider, CustomConfigurations"keyFilePath="configkey.txt" />
</providers>
</configProtectedData>

This will only encrypt the configuration section with the name "sectionName".

Thanks


N.B. all config sections are case sensitive, be careful how you write the xml and using the selectors.

About

a C# configuration Manager handler to allow for multiple clients settings to exists and be easily accessed via custom configuration settings

Resources

Stars

9 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Force GitHub README to respect dark mode (function() { var style = document.createElement('style'); style.textContent = ' .markdown-body { color-scheme: dark light; } .markdown-body pre { background: #161b22 !important; } .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; } .markdown-body table th, .markdown-body table td { border-color: #30363d !important; } .markdown-body img { background: #0d1117; } .markdown-body blockquote { border-left-color: #8b949e; } .markdown-body hr { border-color: #30363d; } '; document.head.appendChild(style); })(); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - twistedtwig/CustomConfigurations: a C# configuration Manager handler to allow for multiple clients settings to exists and be easily accessed via custom configuration settings · GitHub
Skip to content

Repository files navigation

Custom Configurations:

Custom configurations is designed to reduce the repeative lines of code needed to get configuration settings into your application. If there are 5 or 50 settings there doesn't need any extra code to get your settings. It allows the application to simplify the use of configuration settings.

A simple but effective use is to have an object with N number of properties, such as:

publicclassMyAppSettings{publicstringName{get;set;}publicstringLocation{get;set;}publicboolShouldDoX{get;set;}publicintminValue{get;set;}}

Then use the configuration loader to populate the values:

MyAppSettingsappSettings=newCustomConfigurations.Config().Create<MyAppSettings>();

Lets give a simple strongly typed example, lets say we have the following configuration file:

<?xml version="1.0"?>
<configuration>
<configSections>
<sectionname="domainModelTemplate"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations"/>
</configSections>
<domainModelTemplate>
<Configs>
<ConfigurationGroupname="model">
<ValueItems>
<ValueItemkey="CanExecute"value="true"/>
<ValueItemkey="Description"value="domain model template desciption field"/>
<ValueItemkey="NumberUnits"value="5"/>
<ValueItemkey="ModelType"value="TheirType"/>
</ValueItems>
</ConfigurationGroup>
</Configs>
</domainModelTemplate>
<startup><supportedRuntimeversion="v2.0.50727"/></startup></configuration>

We want to load this model into memory:

publicclassDomainModel{publicstringName{get;set;}publicboolCanExecute{get;set;}publicstringDescription{get;set;}publicintNumberUnits{get;set;}publicDomainModelTypeModelType{get;set;}}publicenumDomainModelType{MyType,TheirType,AnotherType,}

We can create a configuration load to isolate the use of custom configuration and simply return a strongly typed object to your business logic:

publicstaticclassConfigurationLoader{publicstaticDomainModelLoadDomainModelTemplate(){returnnewConfig("domainModelTemplate").GetSection("model").Create<DomainModel>();}}

Multipe sections example

Another example is when the app has multiple clients settings to be recorded a section for each can be defined and the values seperated out. The config class allows easy access to a clients configuration and deals with the configuration hooking up in the background for you.

At this point it is not possible to save back to the configuration file. I have tried to get this to work across the board but failed misserably, will try to tackle this again at a later stage, (there are a few commented out sections and tests aimed at this in the committed code).

Here is an example configuration file:

<configuration>
<configSections>
<sectionname="testsection2"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
<sectionGroupname="myCustomGroup">
<sectionname="mysection"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
</sectionGroup>
</configSections>
<myCustomGroup>
<mysection>
<Configs>
<ConfigurationGroupname="client1">
<ValueItems>
<ValueItemkey="key2"value="value2" />
<ValueItemkey="key3"value="value3" />
<ValueItemkey="key4"value="value4" />
<ValueItemkey="key5"value="7" />
<ValueItemkey="key6"value="0.6" /> </ConfigurationGroup>
<ConfigurationGroupname="client2">
<ValueItems>
<ValueItemkey="keya"value="abc" />
<ValueItemkey="key2"value="123" />
</ValueItems>
</ConfigurationGroup>
</Configs>
</mysection>
</myCustomGroup>
<testsection2>
<Configs>
<ConfigurationGroupname="clienta">
<ValueItems>
<ValueItemkey="key2"value="valueabc" /> </ValueItems> </ConfigurationGroup>
</Configs>
</testsection2>
</configuration>
CustomConfigurations.ConfigConfigloader=newCustomConfigurations.Config("client2");

About the examples

The console application "ExampleApp" shows the different ways the customConfiguration application can be used. The examples include:

  • Simply loading the configuration settings and manually getting a setting from it, (SimpleLoadingOfConfiguration.cs)
  • Showing how the application will try and determine the custom section in the config file so you do not have to explicity declare it everytime (LoadingOfConfigurationByAllowingAppToDetermineConfigPath.cs).
  • How to load multiple configuration sections at one time (LoadingMultipleConfigSections.cs)
  • How to create more complex data structures in config, using inner collections (UsingInnerCollections.cs)
  • How to load a different configuration file (LoadingAConfigFileThatIsNotTheDefaultConfig.cs)
  • How to generate strongly typed objects automatically (ExampleApp.MoreComplexExamples.AutoGenerateModelsFromConfig)
  • How to map configuration settings keys to the strongly typed object that have different property names (ExampleApp.MoreComplexExamples.MappingFieldsAutoGen)

Encrypting and decrypting

If required the whole configuration section can be encrypted. The enryption can be used by multiple machines, (no machine key files used). The encryption uses Triple-DES with a key file. The first time it is to be used the key file needs to be generated.

Configconfig=newConfig();config.CreateConfigKey();

There are two ways to encrypt the configuration.

Configconfig=newConfig();config.EncryptConfigurationSection();

This will encrypt all custom config sections in the configuration file.

Configconfig=newConfig();config.EncryptConfigurationSection("sectionName");

To be able to do the encyption and decryption there is one addition to the configuration file:

 <configProtectedData>
<providers>
<addname="TripleDESProtectedConfigurationProvider"type="CustomConfigurations.TripleDESProtectedConfigurationProvider, CustomConfigurations"keyFilePath="configkey.txt" />
</providers>
</configProtectedData>

This will only encrypt the configuration section with the name "sectionName".

Thanks


N.B. all config sections are case sensitive, be careful how you write the xml and using the selectors.

About

a C# configuration Manager handler to allow for multiple clients settings to exists and be easily accessed via custom configuration settings

Resources

Stars

9 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Highlight search terms from Google/DuckDuckGo/Bing referrer (function() { var ref = document.referrer; var terms = []; if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) { var url = new URL(ref); var q = url.searchParams.get('q') || url.searchParams.get('p'); if (q) { terms = q.split(/\s+/).filter(function(t) { return t.length > 2; }); } } if (terms.length === 0) return; var style = document.createElement('style'); style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }'; document.head.appendChild(style); function highlight(node) { if (node.nodeType === 3) { // text node var text = node.textContent; var found = false; terms.forEach(function(term) { var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\]\\]/g, '\\') + ')', 'gi'); if (regex.test(text)) { found = true; var frag = document.createDocumentFragment(); var parts = text.split(regex); parts.forEach(function(part, i) { if (i % 2 === 0) { frag.appendChild(document.createTextNode(part)); } else { var span = document.createElement('span'); span.className = 'userscript-highlight'; span.textContent = part; frag.appendChild(span); } }); node.parentNode.replaceChild(frag, node); } }); } else if (node.nodeType === 1 && node.childNodes) { // element var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT']; if (!skipTags.includes(node.tagName)) { Array.from(node.childNodes).forEach(highlight); } } } highlight(document.body); // Re-highlight on dynamic content var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1 || node.nodeType === 3) highlight(node); }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - twistedtwig/CustomConfigurations: a C# configuration Manager handler to allow for multiple clients settings to exists and be easily accessed via custom configuration settings · GitHub
Skip to content

Repository files navigation

Custom Configurations:

Custom configurations is designed to reduce the repeative lines of code needed to get configuration settings into your application. If there are 5 or 50 settings there doesn't need any extra code to get your settings. It allows the application to simplify the use of configuration settings.

A simple but effective use is to have an object with N number of properties, such as:

publicclassMyAppSettings{publicstringName{get;set;}publicstringLocation{get;set;}publicboolShouldDoX{get;set;}publicintminValue{get;set;}}

Then use the configuration loader to populate the values:

MyAppSettingsappSettings=newCustomConfigurations.Config().Create<MyAppSettings>();

Lets give a simple strongly typed example, lets say we have the following configuration file:

<?xml version="1.0"?>
<configuration>
<configSections>
<sectionname="domainModelTemplate"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations"/>
</configSections>
<domainModelTemplate>
<Configs>
<ConfigurationGroupname="model">
<ValueItems>
<ValueItemkey="CanExecute"value="true"/>
<ValueItemkey="Description"value="domain model template desciption field"/>
<ValueItemkey="NumberUnits"value="5"/>
<ValueItemkey="ModelType"value="TheirType"/>
</ValueItems>
</ConfigurationGroup>
</Configs>
</domainModelTemplate>
<startup><supportedRuntimeversion="v2.0.50727"/></startup></configuration>

We want to load this model into memory:

publicclassDomainModel{publicstringName{get;set;}publicboolCanExecute{get;set;}publicstringDescription{get;set;}publicintNumberUnits{get;set;}publicDomainModelTypeModelType{get;set;}}publicenumDomainModelType{MyType,TheirType,AnotherType,}

We can create a configuration load to isolate the use of custom configuration and simply return a strongly typed object to your business logic:

publicstaticclassConfigurationLoader{publicstaticDomainModelLoadDomainModelTemplate(){returnnewConfig("domainModelTemplate").GetSection("model").Create<DomainModel>();}}

Multipe sections example

Another example is when the app has multiple clients settings to be recorded a section for each can be defined and the values seperated out. The config class allows easy access to a clients configuration and deals with the configuration hooking up in the background for you.

At this point it is not possible to save back to the configuration file. I have tried to get this to work across the board but failed misserably, will try to tackle this again at a later stage, (there are a few commented out sections and tests aimed at this in the committed code).

Here is an example configuration file:

<configuration>
<configSections>
<sectionname="testsection2"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
<sectionGroupname="myCustomGroup">
<sectionname="mysection"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
</sectionGroup>
</configSections>
<myCustomGroup>
<mysection>
<Configs>
<ConfigurationGroupname="client1">
<ValueItems>
<ValueItemkey="key2"value="value2" />
<ValueItemkey="key3"value="value3" />
<ValueItemkey="key4"value="value4" />
<ValueItemkey="key5"value="7" />
<ValueItemkey="key6"value="0.6" /> </ConfigurationGroup>
<ConfigurationGroupname="client2">
<ValueItems>
<ValueItemkey="keya"value="abc" />
<ValueItemkey="key2"value="123" />
</ValueItems>
</ConfigurationGroup>
</Configs>
</mysection>
</myCustomGroup>
<testsection2>
<Configs>
<ConfigurationGroupname="clienta">
<ValueItems>
<ValueItemkey="key2"value="valueabc" /> </ValueItems> </ConfigurationGroup>
</Configs>
</testsection2>
</configuration>
CustomConfigurations.ConfigConfigloader=newCustomConfigurations.Config("client2");

About the examples

The console application "ExampleApp" shows the different ways the customConfiguration application can be used. The examples include:

  • Simply loading the configuration settings and manually getting a setting from it, (SimpleLoadingOfConfiguration.cs)
  • Showing how the application will try and determine the custom section in the config file so you do not have to explicity declare it everytime (LoadingOfConfigurationByAllowingAppToDetermineConfigPath.cs).
  • How to load multiple configuration sections at one time (LoadingMultipleConfigSections.cs)
  • How to create more complex data structures in config, using inner collections (UsingInnerCollections.cs)
  • How to load a different configuration file (LoadingAConfigFileThatIsNotTheDefaultConfig.cs)
  • How to generate strongly typed objects automatically (ExampleApp.MoreComplexExamples.AutoGenerateModelsFromConfig)
  • How to map configuration settings keys to the strongly typed object that have different property names (ExampleApp.MoreComplexExamples.MappingFieldsAutoGen)

Encrypting and decrypting

If required the whole configuration section can be encrypted. The enryption can be used by multiple machines, (no machine key files used). The encryption uses Triple-DES with a key file. The first time it is to be used the key file needs to be generated.

Configconfig=newConfig();config.CreateConfigKey();

There are two ways to encrypt the configuration.

Configconfig=newConfig();config.EncryptConfigurationSection();

This will encrypt all custom config sections in the configuration file.

Configconfig=newConfig();config.EncryptConfigurationSection("sectionName");

To be able to do the encyption and decryption there is one addition to the configuration file:

 <configProtectedData>
<providers>
<addname="TripleDESProtectedConfigurationProvider"type="CustomConfigurations.TripleDESProtectedConfigurationProvider, CustomConfigurations"keyFilePath="configkey.txt" />
</providers>
</configProtectedData>

This will only encrypt the configuration section with the name "sectionName".

Thanks


N.B. all config sections are case sensitive, be careful how you write the xml and using the selectors.

About

a C# configuration Manager handler to allow for multiple clients settings to exists and be easily accessed via custom configuration settings

Resources

Stars

9 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Strip utm_, fbclid, gclid, etc. from all links on page (function() { var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content', 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid', 'ref', 'ref_src', 'source', 'medium', 'campaign']; function cleanUrl(url) { try { var u = new URL(url, window.location.origin); var changed = false; trackingParams.forEach(function(p) { if (u.searchParams.has(p)) { u.searchParams.delete(p); changed = true; } }); return changed ? u.toString() : url; } catch (e) { return url; } } function cleanLinks() { document.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } cleanLinks(); var observer = new MutationObserver(function(mutations) { mutations.forEach(function(m) { m.addedNodes.forEach(function(node) { if (node.nodeType === 1) { if (node.tagName === 'A') cleanLinks(); node.querySelectorAll('a[href]').forEach(function(a) { var clean = cleanUrl(a.href); if (clean !== a.href) a.href = clean; }); } }); }); }); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + ' GitHub - twistedtwig/CustomConfigurations: a C# configuration Manager handler to allow for multiple clients settings to exists and be easily accessed via custom configuration settings · GitHub
Skip to content

Repository files navigation

Custom Configurations:

Custom configurations is designed to reduce the repeative lines of code needed to get configuration settings into your application. If there are 5 or 50 settings there doesn't need any extra code to get your settings. It allows the application to simplify the use of configuration settings.

A simple but effective use is to have an object with N number of properties, such as:

publicclassMyAppSettings{publicstringName{get;set;}publicstringLocation{get;set;}publicboolShouldDoX{get;set;}publicintminValue{get;set;}}

Then use the configuration loader to populate the values:

MyAppSettingsappSettings=newCustomConfigurations.Config().Create<MyAppSettings>();

Lets give a simple strongly typed example, lets say we have the following configuration file:

<?xml version="1.0"?>
<configuration>
<configSections>
<sectionname="domainModelTemplate"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations"/>
</configSections>
<domainModelTemplate>
<Configs>
<ConfigurationGroupname="model">
<ValueItems>
<ValueItemkey="CanExecute"value="true"/>
<ValueItemkey="Description"value="domain model template desciption field"/>
<ValueItemkey="NumberUnits"value="5"/>
<ValueItemkey="ModelType"value="TheirType"/>
</ValueItems>
</ConfigurationGroup>
</Configs>
</domainModelTemplate>
<startup><supportedRuntimeversion="v2.0.50727"/></startup></configuration>

We want to load this model into memory:

publicclassDomainModel{publicstringName{get;set;}publicboolCanExecute{get;set;}publicstringDescription{get;set;}publicintNumberUnits{get;set;}publicDomainModelTypeModelType{get;set;}}publicenumDomainModelType{MyType,TheirType,AnotherType,}

We can create a configuration load to isolate the use of custom configuration and simply return a strongly typed object to your business logic:

publicstaticclassConfigurationLoader{publicstaticDomainModelLoadDomainModelTemplate(){returnnewConfig("domainModelTemplate").GetSection("model").Create<DomainModel>();}}

Multipe sections example

Another example is when the app has multiple clients settings to be recorded a section for each can be defined and the values seperated out. The config class allows easy access to a clients configuration and deals with the configuration hooking up in the background for you.

At this point it is not possible to save back to the configuration file. I have tried to get this to work across the board but failed misserably, will try to tackle this again at a later stage, (there are a few commented out sections and tests aimed at this in the committed code).

Here is an example configuration file:

<configuration>
<configSections>
<sectionname="testsection2"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
<sectionGroupname="myCustomGroup">
<sectionname="mysection"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
</sectionGroup>
</configSections>
<myCustomGroup>
<mysection>
<Configs>
<ConfigurationGroupname="client1">
<ValueItems>
<ValueItemkey="key2"value="value2" />
<ValueItemkey="key3"value="value3" />
<ValueItemkey="key4"value="value4" />
<ValueItemkey="key5"value="7" />
<ValueItemkey="key6"value="0.6" /> </ConfigurationGroup>
<ConfigurationGroupname="client2">
<ValueItems>
<ValueItemkey="keya"value="abc" />
<ValueItemkey="key2"value="123" />
</ValueItems>
</ConfigurationGroup>
</Configs>
</mysection>
</myCustomGroup>
<testsection2>
<Configs>
<ConfigurationGroupname="clienta">
<ValueItems>
<ValueItemkey="key2"value="valueabc" /> </ValueItems> </ConfigurationGroup>
</Configs>
</testsection2>
</configuration>
CustomConfigurations.ConfigConfigloader=newCustomConfigurations.Config("client2");

About the examples

The console application "ExampleApp" shows the different ways the customConfiguration application can be used. The examples include:

  • Simply loading the configuration settings and manually getting a setting from it, (SimpleLoadingOfConfiguration.cs)
  • Showing how the application will try and determine the custom section in the config file so you do not have to explicity declare it everytime (LoadingOfConfigurationByAllowingAppToDetermineConfigPath.cs).
  • How to load multiple configuration sections at one time (LoadingMultipleConfigSections.cs)
  • How to create more complex data structures in config, using inner collections (UsingInnerCollections.cs)
  • How to load a different configuration file (LoadingAConfigFileThatIsNotTheDefaultConfig.cs)
  • How to generate strongly typed objects automatically (ExampleApp.MoreComplexExamples.AutoGenerateModelsFromConfig)
  • How to map configuration settings keys to the strongly typed object that have different property names (ExampleApp.MoreComplexExamples.MappingFieldsAutoGen)

Encrypting and decrypting

If required the whole configuration section can be encrypted. The enryption can be used by multiple machines, (no machine key files used). The encryption uses Triple-DES with a key file. The first time it is to be used the key file needs to be generated.

Configconfig=newConfig();config.CreateConfigKey();

There are two ways to encrypt the configuration.

Configconfig=newConfig();config.EncryptConfigurationSection();

This will encrypt all custom config sections in the configuration file.

Configconfig=newConfig();config.EncryptConfigurationSection("sectionName");

To be able to do the encyption and decryption there is one addition to the configuration file:

 <configProtectedData>
<providers>
<addname="TripleDESProtectedConfigurationProvider"type="CustomConfigurations.TripleDESProtectedConfigurationProvider, CustomConfigurations"keyFilePath="configkey.txt" />
</providers>
</configProtectedData>

This will only encrypt the configuration section with the name "sectionName".

Thanks


N.B. all config sections are case sensitive, be careful how you write the xml and using the selectors.

About

a C# configuration Manager handler to allow for multiple clients settings to exists and be easily accessed via custom configuration settings

Resources

Stars

9 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Auto-enable theater mode on YouTube (function() { function tryTheater() { var btn = document.querySelector('button[aria-label="Theater mode"], ytd-player #player button[title="Theater mode"]'); if (btn && !btn.classList.contains('activated')) { btn.click(); } } // Try immediately tryTheater(); // Try after navigation (SPA) var lastUrl = location.href; setInterval(function() { if (location.href !== lastUrl) { lastUrl = location.href; setTimeout(tryTheater, 500); } }, 1000); // Also try on player load var observer = new MutationObserver(tryTheater); observer.observe(document.body, { childList: true, subtree: true }); })(); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - twistedtwig/CustomConfigurations: a C# configuration Manager handler to allow for multiple clients settings to exists and be easily accessed via custom configuration settings · GitHub
Skip to content

Repository files navigation

Custom Configurations:

Custom configurations is designed to reduce the repeative lines of code needed to get configuration settings into your application. If there are 5 or 50 settings there doesn't need any extra code to get your settings. It allows the application to simplify the use of configuration settings.

A simple but effective use is to have an object with N number of properties, such as:

publicclassMyAppSettings{publicstringName{get;set;}publicstringLocation{get;set;}publicboolShouldDoX{get;set;}publicintminValue{get;set;}}

Then use the configuration loader to populate the values:

MyAppSettingsappSettings=newCustomConfigurations.Config().Create<MyAppSettings>();

Lets give a simple strongly typed example, lets say we have the following configuration file:

<?xml version="1.0"?>
<configuration>
<configSections>
<sectionname="domainModelTemplate"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations"/>
</configSections>
<domainModelTemplate>
<Configs>
<ConfigurationGroupname="model">
<ValueItems>
<ValueItemkey="CanExecute"value="true"/>
<ValueItemkey="Description"value="domain model template desciption field"/>
<ValueItemkey="NumberUnits"value="5"/>
<ValueItemkey="ModelType"value="TheirType"/>
</ValueItems>
</ConfigurationGroup>
</Configs>
</domainModelTemplate>
<startup><supportedRuntimeversion="v2.0.50727"/></startup></configuration>

We want to load this model into memory:

publicclassDomainModel{publicstringName{get;set;}publicboolCanExecute{get;set;}publicstringDescription{get;set;}publicintNumberUnits{get;set;}publicDomainModelTypeModelType{get;set;}}publicenumDomainModelType{MyType,TheirType,AnotherType,}

We can create a configuration load to isolate the use of custom configuration and simply return a strongly typed object to your business logic:

publicstaticclassConfigurationLoader{publicstaticDomainModelLoadDomainModelTemplate(){returnnewConfig("domainModelTemplate").GetSection("model").Create<DomainModel>();}}

Multipe sections example

Another example is when the app has multiple clients settings to be recorded a section for each can be defined and the values seperated out. The config class allows easy access to a clients configuration and deals with the configuration hooking up in the background for you.

At this point it is not possible to save back to the configuration file. I have tried to get this to work across the board but failed misserably, will try to tackle this again at a later stage, (there are a few commented out sections and tests aimed at this in the committed code).

Here is an example configuration file:

<configuration>
<configSections>
<sectionname="testsection2"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
<sectionGroupname="myCustomGroup">
<sectionname="mysection"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
</sectionGroup>
</configSections>
<myCustomGroup>
<mysection>
<Configs>
<ConfigurationGroupname="client1">
<ValueItems>
<ValueItemkey="key2"value="value2" />
<ValueItemkey="key3"value="value3" />
<ValueItemkey="key4"value="value4" />
<ValueItemkey="key5"value="7" />
<ValueItemkey="key6"value="0.6" /> </ConfigurationGroup>
<ConfigurationGroupname="client2">
<ValueItems>
<ValueItemkey="keya"value="abc" />
<ValueItemkey="key2"value="123" />
</ValueItems>
</ConfigurationGroup>
</Configs>
</mysection>
</myCustomGroup>
<testsection2>
<Configs>
<ConfigurationGroupname="clienta">
<ValueItems>
<ValueItemkey="key2"value="valueabc" /> </ValueItems> </ConfigurationGroup>
</Configs>
</testsection2>
</configuration>
CustomConfigurations.ConfigConfigloader=newCustomConfigurations.Config("client2");

About the examples

The console application "ExampleApp" shows the different ways the customConfiguration application can be used. The examples include:

  • Simply loading the configuration settings and manually getting a setting from it, (SimpleLoadingOfConfiguration.cs)
  • Showing how the application will try and determine the custom section in the config file so you do not have to explicity declare it everytime (LoadingOfConfigurationByAllowingAppToDetermineConfigPath.cs).
  • How to load multiple configuration sections at one time (LoadingMultipleConfigSections.cs)
  • How to create more complex data structures in config, using inner collections (UsingInnerCollections.cs)
  • How to load a different configuration file (LoadingAConfigFileThatIsNotTheDefaultConfig.cs)
  • How to generate strongly typed objects automatically (ExampleApp.MoreComplexExamples.AutoGenerateModelsFromConfig)
  • How to map configuration settings keys to the strongly typed object that have different property names (ExampleApp.MoreComplexExamples.MappingFieldsAutoGen)

Encrypting and decrypting

If required the whole configuration section can be encrypted. The enryption can be used by multiple machines, (no machine key files used). The encryption uses Triple-DES with a key file. The first time it is to be used the key file needs to be generated.

Configconfig=newConfig();config.CreateConfigKey();

There are two ways to encrypt the configuration.

Configconfig=newConfig();config.EncryptConfigurationSection();

This will encrypt all custom config sections in the configuration file.

Configconfig=newConfig();config.EncryptConfigurationSection("sectionName");

To be able to do the encyption and decryption there is one addition to the configuration file:

 <configProtectedData>
<providers>
<addname="TripleDESProtectedConfigurationProvider"type="CustomConfigurations.TripleDESProtectedConfigurationProvider, CustomConfigurations"keyFilePath="configkey.txt" />
</providers>
</configProtectedData>

This will only encrypt the configuration section with the name "sectionName".

Thanks


N.B. all config sections are case sensitive, be careful how you write the xml and using the selectors.

About

a C# configuration Manager handler to allow for multiple clients settings to exists and be easily accessed via custom configuration settings

Resources

Stars

9 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Remove or un-stick sticky/fixed headers that block content (function() { function unstick() { document.querySelectorAll('header, nav, [role="banner"], .header, .navbar, .sticky, .fixed-top, [style*="position: fixed"], [style*="position:sticky"]').forEach(function(el) { if (el.style.position === 'fixed' || el.style.position === 'sticky' || getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') { el.style.position = 'static'; el.style.top = 'auto'; el.style.zIndex = 'auto'; } }); } unstick(); var observer = new MutationObserver(unstick); observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] }); })(); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + ' GitHub - twistedtwig/CustomConfigurations: a C# configuration Manager handler to allow for multiple clients settings to exists and be easily accessed via custom configuration settings · GitHub
Skip to content

Repository files navigation

Custom Configurations:

Custom configurations is designed to reduce the repeative lines of code needed to get configuration settings into your application. If there are 5 or 50 settings there doesn't need any extra code to get your settings. It allows the application to simplify the use of configuration settings.

A simple but effective use is to have an object with N number of properties, such as:

publicclassMyAppSettings{publicstringName{get;set;}publicstringLocation{get;set;}publicboolShouldDoX{get;set;}publicintminValue{get;set;}}

Then use the configuration loader to populate the values:

MyAppSettingsappSettings=newCustomConfigurations.Config().Create<MyAppSettings>();

Lets give a simple strongly typed example, lets say we have the following configuration file:

<?xml version="1.0"?>
<configuration>
<configSections>
<sectionname="domainModelTemplate"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations"/>
</configSections>
<domainModelTemplate>
<Configs>
<ConfigurationGroupname="model">
<ValueItems>
<ValueItemkey="CanExecute"value="true"/>
<ValueItemkey="Description"value="domain model template desciption field"/>
<ValueItemkey="NumberUnits"value="5"/>
<ValueItemkey="ModelType"value="TheirType"/>
</ValueItems>
</ConfigurationGroup>
</Configs>
</domainModelTemplate>
<startup><supportedRuntimeversion="v2.0.50727"/></startup></configuration>

We want to load this model into memory:

publicclassDomainModel{publicstringName{get;set;}publicboolCanExecute{get;set;}publicstringDescription{get;set;}publicintNumberUnits{get;set;}publicDomainModelTypeModelType{get;set;}}publicenumDomainModelType{MyType,TheirType,AnotherType,}

We can create a configuration load to isolate the use of custom configuration and simply return a strongly typed object to your business logic:

publicstaticclassConfigurationLoader{publicstaticDomainModelLoadDomainModelTemplate(){returnnewConfig("domainModelTemplate").GetSection("model").Create<DomainModel>();}}

Multipe sections example

Another example is when the app has multiple clients settings to be recorded a section for each can be defined and the values seperated out. The config class allows easy access to a clients configuration and deals with the configuration hooking up in the background for you.

At this point it is not possible to save back to the configuration file. I have tried to get this to work across the board but failed misserably, will try to tackle this again at a later stage, (there are a few commented out sections and tests aimed at this in the committed code).

Here is an example configuration file:

<configuration>
<configSections>
<sectionname="testsection2"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
<sectionGroupname="myCustomGroup">
<sectionname="mysection"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
</sectionGroup>
</configSections>
<myCustomGroup>
<mysection>
<Configs>
<ConfigurationGroupname="client1">
<ValueItems>
<ValueItemkey="key2"value="value2" />
<ValueItemkey="key3"value="value3" />
<ValueItemkey="key4"value="value4" />
<ValueItemkey="key5"value="7" />
<ValueItemkey="key6"value="0.6" /> </ConfigurationGroup>
<ConfigurationGroupname="client2">
<ValueItems>
<ValueItemkey="keya"value="abc" />
<ValueItemkey="key2"value="123" />
</ValueItems>
</ConfigurationGroup>
</Configs>
</mysection>
</myCustomGroup>
<testsection2>
<Configs>
<ConfigurationGroupname="clienta">
<ValueItems>
<ValueItemkey="key2"value="valueabc" /> </ValueItems> </ConfigurationGroup>
</Configs>
</testsection2>
</configuration>
CustomConfigurations.ConfigConfigloader=newCustomConfigurations.Config("client2");

About the examples

The console application "ExampleApp" shows the different ways the customConfiguration application can be used. The examples include:

  • Simply loading the configuration settings and manually getting a setting from it, (SimpleLoadingOfConfiguration.cs)
  • Showing how the application will try and determine the custom section in the config file so you do not have to explicity declare it everytime (LoadingOfConfigurationByAllowingAppToDetermineConfigPath.cs).
  • How to load multiple configuration sections at one time (LoadingMultipleConfigSections.cs)
  • How to create more complex data structures in config, using inner collections (UsingInnerCollections.cs)
  • How to load a different configuration file (LoadingAConfigFileThatIsNotTheDefaultConfig.cs)
  • How to generate strongly typed objects automatically (ExampleApp.MoreComplexExamples.AutoGenerateModelsFromConfig)
  • How to map configuration settings keys to the strongly typed object that have different property names (ExampleApp.MoreComplexExamples.MappingFieldsAutoGen)

Encrypting and decrypting

If required the whole configuration section can be encrypted. The enryption can be used by multiple machines, (no machine key files used). The encryption uses Triple-DES with a key file. The first time it is to be used the key file needs to be generated.

Configconfig=newConfig();config.CreateConfigKey();

There are two ways to encrypt the configuration.

Configconfig=newConfig();config.EncryptConfigurationSection();

This will encrypt all custom config sections in the configuration file.

Configconfig=newConfig();config.EncryptConfigurationSection("sectionName");

To be able to do the encyption and decryption there is one addition to the configuration file:

 <configProtectedData>
<providers>
<addname="TripleDESProtectedConfigurationProvider"type="CustomConfigurations.TripleDESProtectedConfigurationProvider, CustomConfigurations"keyFilePath="configkey.txt" />
</providers>
</configProtectedData>

This will only encrypt the configuration section with the name "sectionName".

Thanks


N.B. all config sections are case sensitive, be careful how you write the xml and using the selectors.

About

a C# configuration Manager handler to allow for multiple clients settings to exists and be easily accessed via custom configuration settings

Resources

Stars

9 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { // Universal Dark Mode - works on any site (function() { var enabled = true; function applyDarkMode() { if (!enabled) return; // Create style element if it doesn't exist var style = document.getElementById('universal-dark-mode-style'); if (!style) { style = document.createElement('style'); style.id = 'universal-dark-mode-style'; document.head.appendChild(style); } // Dark mode CSS - inverts colors but preserves images/video style.textContent = ' /* Invert everything except media */ html { filter: invert(1) hue-rotate(180deg) !important; background: #1a1a2e !important; } /* Restore images, videos, iframes, canvas */ img, video, iframe, canvas, svg, picture, [style*="background-image"] { filter: invert(1) hue-rotate(180deg) !important; } /* Preserve specific elements that should not be inverted */ .no-dark-mode, .no-dark-mode *, [data-theme="light"], [data-theme="light"], .ace_editor, .ace_editor *, .CodeMirror, .CodeMirror *, .monaco-editor, .monaco-editor *, .markdown-body pre, .markdown-body pre *, .highlight, .highlight *, pre code, pre code * { filter: none !important; } /* Fix common UI elements */ .modal, .popup, .dropdown-menu, .tooltip, .popover { filter: invert(1) hue-rotate(180deg) !important; background: #2d2d44 !important; border-color: #444 !important; } /* Scrollbars */ ::-webkit-scrollbar { background: #1a1a2e !important; } ::-webkit-scrollbar-thumb { background: #444 !important; } ::-webkit-scrollbar-thumb:hover { background: #555 !important; } /* Selection */ ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; } ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; } '; } function removeDarkMode() { var style = document.getElementById('universal-dark-mode-style'); if (style) style.remove(); } // Toggle with Alt+Shift+D document.addEventListener('keydown', function(e) { if (e.altKey && e.shiftKey && e.key === 'D') { e.preventDefault(); enabled = !enabled; if (enabled) { applyDarkMode(); console.log('[Universal Dark Mode] Enabled'); } else { removeDarkMode(); console.log('[Universal Dark Mode] Disabled'); } } }); // Apply on load applyDarkMode(); // Re-apply on dynamic content var observer = new MutationObserver(function(mutations) { if (enabled && !document.getElementById('universal-dark-mode-style')) { applyDarkMode(); } }); observer.observe(document.head, { childList: true }); console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle'); })(); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })(); GitHub - twistedtwig/CustomConfigurations: a C# configuration Manager handler to allow for multiple clients settings to exists and be easily accessed via custom configuration settings · GitHub
Skip to content

Repository files navigation

Custom Configurations:

Custom configurations is designed to reduce the repeative lines of code needed to get configuration settings into your application. If there are 5 or 50 settings there doesn't need any extra code to get your settings. It allows the application to simplify the use of configuration settings.

A simple but effective use is to have an object with N number of properties, such as:

publicclassMyAppSettings{publicstringName{get;set;}publicstringLocation{get;set;}publicboolShouldDoX{get;set;}publicintminValue{get;set;}}

Then use the configuration loader to populate the values:

MyAppSettingsappSettings=newCustomConfigurations.Config().Create<MyAppSettings>();

Lets give a simple strongly typed example, lets say we have the following configuration file:

<?xml version="1.0"?>
<configuration>
<configSections>
<sectionname="domainModelTemplate"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations"/>
</configSections>
<domainModelTemplate>
<Configs>
<ConfigurationGroupname="model">
<ValueItems>
<ValueItemkey="CanExecute"value="true"/>
<ValueItemkey="Description"value="domain model template desciption field"/>
<ValueItemkey="NumberUnits"value="5"/>
<ValueItemkey="ModelType"value="TheirType"/>
</ValueItems>
</ConfigurationGroup>
</Configs>
</domainModelTemplate>
<startup><supportedRuntimeversion="v2.0.50727"/></startup></configuration>

We want to load this model into memory:

publicclassDomainModel{publicstringName{get;set;}publicboolCanExecute{get;set;}publicstringDescription{get;set;}publicintNumberUnits{get;set;}publicDomainModelTypeModelType{get;set;}}publicenumDomainModelType{MyType,TheirType,AnotherType,}

We can create a configuration load to isolate the use of custom configuration and simply return a strongly typed object to your business logic:

publicstaticclassConfigurationLoader{publicstaticDomainModelLoadDomainModelTemplate(){returnnewConfig("domainModelTemplate").GetSection("model").Create<DomainModel>();}}

Multipe sections example

Another example is when the app has multiple clients settings to be recorded a section for each can be defined and the values seperated out. The config class allows easy access to a clients configuration and deals with the configuration hooking up in the background for you.

At this point it is not possible to save back to the configuration file. I have tried to get this to work across the board but failed misserably, will try to tackle this again at a later stage, (there are a few commented out sections and tests aimed at this in the committed code).

Here is an example configuration file:

<configuration>
<configSections>
<sectionname="testsection2"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
<sectionGroupname="myCustomGroup">
<sectionname="mysection"type="CustomConfigurations.ConfigurationSectionLoader, CustomConfigurations" />
</sectionGroup>
</configSections>
<myCustomGroup>
<mysection>
<Configs>
<ConfigurationGroupname="client1">
<ValueItems>
<ValueItemkey="key2"value="value2" />
<ValueItemkey="key3"value="value3" />
<ValueItemkey="key4"value="value4" />
<ValueItemkey="key5"value="7" />
<ValueItemkey="key6"value="0.6" /> </ConfigurationGroup>
<ConfigurationGroupname="client2">
<ValueItems>
<ValueItemkey="keya"value="abc" />
<ValueItemkey="key2"value="123" />
</ValueItems>
</ConfigurationGroup>
</Configs>
</mysection>
</myCustomGroup>
<testsection2>
<Configs>
<ConfigurationGroupname="clienta">
<ValueItems>
<ValueItemkey="key2"value="valueabc" /> </ValueItems> </ConfigurationGroup>
</Configs>
</testsection2>
</configuration>
CustomConfigurations.ConfigConfigloader=newCustomConfigurations.Config("client2");

About the examples

The console application "ExampleApp" shows the different ways the customConfiguration application can be used. The examples include:

  • Simply loading the configuration settings and manually getting a setting from it, (SimpleLoadingOfConfiguration.cs)
  • Showing how the application will try and determine the custom section in the config file so you do not have to explicity declare it everytime (LoadingOfConfigurationByAllowingAppToDetermineConfigPath.cs).
  • How to load multiple configuration sections at one time (LoadingMultipleConfigSections.cs)
  • How to create more complex data structures in config, using inner collections (UsingInnerCollections.cs)
  • How to load a different configuration file (LoadingAConfigFileThatIsNotTheDefaultConfig.cs)
  • How to generate strongly typed objects automatically (ExampleApp.MoreComplexExamples.AutoGenerateModelsFromConfig)
  • How to map configuration settings keys to the strongly typed object that have different property names (ExampleApp.MoreComplexExamples.MappingFieldsAutoGen)

Encrypting and decrypting

If required the whole configuration section can be encrypted. The enryption can be used by multiple machines, (no machine key files used). The encryption uses Triple-DES with a key file. The first time it is to be used the key file needs to be generated.

Configconfig=newConfig();config.CreateConfigKey();

There are two ways to encrypt the configuration.

Configconfig=newConfig();config.EncryptConfigurationSection();

This will encrypt all custom config sections in the configuration file.

Configconfig=newConfig();config.EncryptConfigurationSection("sectionName");

To be able to do the encyption and decryption there is one addition to the configuration file:

 <configProtectedData>
<providers>
<addname="TripleDESProtectedConfigurationProvider"type="CustomConfigurations.TripleDESProtectedConfigurationProvider, CustomConfigurations"keyFilePath="configkey.txt" />
</providers>
</configProtectedData>

This will only encrypt the configuration section with the name "sectionName".

Thanks


N.B. all config sections are case sensitive, be careful how you write the xml and using the selectors.

About

a C# configuration Manager handler to allow for multiple clients settings to exists and be easily accessed via custom configuration settings

Resources

Stars

9 stars

Watchers

3 watching

Forks

Releases

Packages

Used by

Contributors

Languages