DRN.Framework.Utils
0.4.0
Prefix Reserved
See the version list below for details.
dotnet add package DRN.Framework.Utils --version 0.4.0
NuGet\Install-Package DRN.Framework.Utils -Version 0.4.0
<PackageReference Include="DRN.Framework.Utils" Version="0.4.0" />
<PackageVersion Include="DRN.Framework.Utils" Version="0.4.0" />
<PackageReference Include="DRN.Framework.Utils" />
paket add DRN.Framework.Utils --version 0.4.0
#r "nuget: DRN.Framework.Utils, 0.4.0"
#:package DRN.Framework.Utils@0.4.0
#addin nuget:?package=DRN.Framework.Utils&version=0.4.0
#tool nuget:?package=DRN.Framework.Utils&version=0.4.0
DRN.Framework.Utils package contains common codes for other DRN.Framework packages and projects developed with DRN.Framework.
Module
DRN.Utils can be added with following module
namespace DRN.Framework.Utils;
public static class UtilsModule
{
public static IServiceCollection AddDrnUtils(this IServiceCollection collection)
{
collection.AddServicesWithAttributes();
return collection;
}
}
Dependency Injection with Attributes
Each module should be created in the assembly that will be scanned.
public static class InfraModule
{
public static IServiceCollection AddSampleInfraServices(this IServiceCollection sc)
{
sc.AddServicesWithAttributes();
return sc;
}
}
Services resolution for attribute based services can be validated with a single line.
serviceProvider.ValidateServicesAddedByAttributes();
Attribute based dependency injection reduces wiring efforts and helps developer to focus on developing. This approach also improves service resolution validation during startup and integration testing.
[Theory]
[DataInlineContext]
public void Validate_Sample_Dependencies(TestContext context)
{
context.ServiceCollection.AddSampleApplicationServices();
context.ServiceCollection.AddSampleInfraServices();
context.ValidateServices();
}
Lifetime Attributes
Example attribute usage:
[Transient<IIndependent>]
public class Independent : IIndependent
{
}
Following attributes marks services with a lifetime and when service collection called with AddServicesWithAttributes method in the assembly marked belong they are automatically added.
namespace DRN.Framework.Utils.DependencyInjection.Attributes;
public class LifetimeAttribute<TService>(ServiceLifetime serviceLifetime, bool tryAdd = true, object? key = null)
: LifetimeAttribute(serviceLifetime, typeof(TService), tryAdd, key);
public class LifetimeWithKeyAttribute<TService>(ServiceLifetime serviceLifetime, object key, bool tryAdd = true)
: LifetimeAttribute(serviceLifetime, typeof(TService), tryAdd, key);
public class ScopedAttribute<TService>(bool tryAdd = true) : LifetimeAttribute<TService>(ServiceLifetime.Scoped, tryAdd);
public class ScopedWithKeyAttribute<TService>(object key, bool tryAdd = true) : LifetimeWithKeyAttribute<TService>(ServiceLifetime.Scoped, key, tryAdd);
public class TransientAttribute<TService>(bool tryAdd = true) : LifetimeAttribute<TService>(ServiceLifetime.Transient, tryAdd);
public class TransientWithKeyAttribute<TService>(object key, bool tryAdd = true) : LifetimeWithKeyAttribute<TService>(ServiceLifetime.Transient, key, tryAdd);
public class SingletonAttribute<TService>(bool tryAdd = true) : LifetimeAttribute<TService>(ServiceLifetime.Singleton, tryAdd);
public class SingletonWithKeyAttribute<TService>(object key, bool tryAdd = true) : LifetimeWithKeyAttribute<TService>(ServiceLifetime.Singleton, key, tryAdd);
HasServiceCollectionModuleAttribute
Attributes derived from HasServiceCollectionModuleAttribute can be used to mark custom service collection modules.
In the following example HasDrnContextServiceCollectionModuleAttribute marks DrnContext<TContext> and its service collection module.
This way dbContexts inherited from DrnContext doesn't need a lifetime attribute and they can be registered by AddServicesWithAttributes with their custom
factory.
This offers following flexibility:
- ServiceCollectionModule of DrnContexts are defined in
DRN.Framework.EntityFramework - Inherited dbContexts are defined in user defined projects and points a module in another project.
AddServicesWithAttributesextension method defined inDRN.Framework.Utilsregisters them without dependingDRN.Framework.EntityFrameworkproject
public class HasDrnContextServiceCollectionModuleAttribute : HasServiceCollectionModuleAttribute
{
static HasDrnContextServiceCollectionModuleAttribute() =>
ModuleMethodInfo = typeof(ServiceCollectionExtensions)
.GetMethod(nameof(ServiceCollectionExtensions.AddDbContextsWithConventions))!;
public override async Task PostStartupValidationAsync(object service, IServiceProvider serviceProvider)
{
var appSettings = serviceProvider.GetRequiredService<IAppSettings>();
var migrate = appSettings.Configuration.GetValue(DbContextConventions.AutoMigrateDevEnvironmentKey, false);
if (appSettings.Environment == AppEnvironment.Development && migrate && service is DbContext context)
await context.Database.MigrateAsync();
}
}
[HasDrnContextServiceCollectionModule]
public abstract class DrnContext<TContext> : DbContext, IDesignTimeDbContextFactory<TContext>, IDesignTimeServices where TContext : DbContext, new()
{
...
HasServiceCollectionModuleAttribute's PostStartupValidationAsync will be called when,
- ValidateServicesAddedByAttributes extension method called from service provider if all services resolved successfully.
- For instance, DrnContext can apply EF migrations after service provider services resolved successfully.
Configurations
Following configuration sources can be used to add configurations from different sources
- JsonSerializerConfigurationSource converts poco objects to configuration
- RemoteJsonConfigurationSource fetches remote configuration (experimental and incomplete)
Following MountedSettingsConventions will be added to configuration.
- /appconfig/json-settings json files will be added to configuration if any exist
- /appconfig/key-per-file-settings files will be added to configuration if any exist
- IMountedSettingsConventionsOverride overrides default /appconfig location if added to service collection before host built
namespace DRN.Framework.Utils.Settings.Conventions;
public static class MountedSettingsConventions
{
public const string DefaultMountDirectory = "/appconfig";
public static string JsonSettingsMountDirectory(string? mountDirectory = null)
=> Path.Combine(mountDirectory ?? DefaultMountDirectory, "json-settings");
public static string KeyPerFileSettingsMountDirectory(string? mountDirectory = null)
=> Path.Combine(mountDirectory ?? DefaultMountDirectory, "key-per-file-settings");
public static DirectoryInfo JsonSettingDirectoryInfo(string? mountDirectory = null)
=> new(JsonSettingsMountDirectory(mountDirectory));
}
public interface IMountedSettingsConventionsOverride
{
string? MountedSettingsDirectory { get; }
}
AppSettings
Following IAppSettings interface is defined and can be used to obtain appsettings. It has utility methods that allow fail fast.
namespace DRN.Framework.Utils.Settings;
public interface IAppSettings
{
AppEnvironment Environment { get; }
IConfiguration Configuration { get; }
bool TryGetConnectionString(string name, out string connectionString);
string GetRequiredConnectionString(string name);
bool TryGetSection(string key, out IConfigurationSection section);
IConfigurationSection GetRequiredSection(string key);
T? GetValue<T>(string key);
T? GetValue<T>(string key, T defaultValue);
T? Get<T>(string key, Action<BinderOptions>? configureOptions = null);
ConfigurationDebugView GetDebugView();
}
ExtensionMethods
- ServiceCollectionExtensions
- ReplaceInstance
- ReplaceTransient
- ReplaceScoped
- ReplaceSingleton
- GetAllAssignableTo<TService>
- StringExtensions
- ToStream
- TypeExtensions
- MakeGenericMethod
- AssemblyExtensions
- GetTypesAssignableTo
Semper Progredi: Always Progressive
Commit Info
Author: Duran Serkan KILIÇ
Date: 2024-05-19 23:25:32 +0300
Hash: 2c6009a829defc78647603ba828566ea52aeb989
| Product | Versions Compatible and additional computed target framework versions. |
|---|---|
| .NET | net8.0 is compatible. net8.0-android was computed. net8.0-browser was computed. net8.0-ios was computed. net8.0-maccatalyst was computed. net8.0-macos was computed. net8.0-tvos was computed. net8.0-windows was computed. net9.0 was computed. net9.0-android was computed. net9.0-browser was computed. net9.0-ios was computed. net9.0-maccatalyst was computed. net9.0-macos was computed. net9.0-tvos was computed. net9.0-windows was computed. net10.0 was computed. net10.0-android was computed. net10.0-browser was computed. net10.0-ios was computed. net10.0-maccatalyst was computed. net10.0-macos was computed. net10.0-tvos was computed. net10.0-windows was computed. |
-
net8.0
- DRN.Framework.SharedKernel (>= 0.4.0)
- Flurl.Http (>= 4.0.2)
- Microsoft.Extensions.Configuration.Binder (>= 8.0.1)
- Microsoft.Extensions.Configuration.Json (>= 8.0.0)
- Microsoft.Extensions.DependencyInjection (>= 8.0.0)
- Microsoft.Extensions.Hosting.Abstractions (>= 8.0.0)
- System.Net.Http (>= 4.3.4)
- System.Text.RegularExpressions (>= 4.3.1)
NuGet packages (2)
Showing the top 2 NuGet packages that depend on DRN.Framework.Utils:
| Package | Downloads |
|---|---|
|
DRN.Framework.EntityFramework
DRN.Framework.EntityFramework provides DrnContext with conventions to develop rapid and effective domain models. ## Commit Info Author: Duran Serkan KILIÇ Date: 2026-03-08 23:03:03 +0300 Hash: a79b5357114f874f8a2956315f27911d316b9bac |
|
|
DRN.Framework.Hosting
DRN.Framework.Hosting ## Commit Info Author: Duran Serkan KILIÇ Date: 2026-03-08 23:03:03 +0300 Hash: a79b5357114f874f8a2956315f27911d316b9bac |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 0.7.0 | 50 | 3/8/2026 |
| 0.7.0-preview067 | 56 | 3/7/2026 |
| 0.7.0-preview066 | 116 | 2/28/2026 |
| 0.7.0-preview065 | 111 | 2/25/2026 |
| 0.7.0-preview064 | 103 | 2/22/2026 |
| 0.7.0-preview063 | 109 | 2/21/2026 |
| 0.7.0-preview062 | 113 | 2/11/2026 |
| 0.7.0-preview061 | 131 | 2/7/2026 |
| 0.7.0-preview060 | 113 | 1/28/2026 |
| 0.7.0-preview059 | 113 | 1/26/2026 |
| 0.7.0-preview058 | 116 | 1/25/2026 |
| 0.7.0-preview057 | 114 | 1/25/2026 |
| 0.7.0-preview056 | 118 | 1/10/2026 |
| 0.7.0-preview055 | 290 | 12/16/2025 |
| 0.7.0-preview054 | 196 | 12/13/2025 |
| 0.7.0-preview053 | 139 | 12/12/2025 |
| 0.7.0-preview052 | 449 | 12/9/2025 |
| 0.7.0-preview051 | 323 | 12/7/2025 |
| 0.7.0-preview050 | 240 | 12/7/2025 |
| 0.4.0 | 241 | 5/19/2024 |
Not every version includes changes, features or bug fixes. This project can increment version to keep consistency with other DRN.Framework projects.
## Version 0.4.0
My family celebrates the enduring legacy of Mustafa Kemal Atatürk's enlightenment ideals. This release is dedicated to 19 May Commemoration of Atatürk, Youth and Sports Day.
### Breaking Changes
* AttributeSpecifiedServiceCollectionModule renamed as AttributeSpecifiedServiceModule
* HasServiceCollectionModuleAttribute renamed as ServiceRegistrationAttribute
* HasDrnContextServiceCollectionModuleAttribute renamed as DrnContextServiceRegistrationAttribute
* ServiceRegistrationAttribute MethodInfo property replaced with ServiceRegistration method to make usage strongly typed and support inheritance
### New Features
* DrnAppFeatures property added to IAppSettings
* InternalRequestHttpVersion can be set as "1.1" or "2.0"
* InternalRequestProtocol can be set as "http" or "https ""
* IInternalRequest and InternalRequest added to generate internal Flurl requests with configurable **Linkerd compatible** sensible defaults
* HttpResponse and following flurl response extensions added to fluently get strongly typed response and flurl response together:
* ToStringAsync
* ToBytesAsync
* ToStreamAsync
* ToJsonAsync<TResponse>
## Version 0.3.0
My family celebrates the enduring legacy of Mustafa Kemal Atatürk's enlightenment ideals. This release is dedicated to 23 April National Sovereignty and Children's Day.
### New Features
* AppSettings now has GetDebugView() method that returns ConfigurationDebugView
* ConfigurationDebugView has ToSummary() method that returns human friendly configuration summary model.
* AppSettings now has GetValue<> and Get<> methods to get values from configuration
* MountedSettingsConventions added.
* /appconfig/json-settings json files will be added to configuration if any exist
* /appconfig/key-per-file-settings files will be added to configuration if any exist
* IMountedSettingsConventionsOverride overrides default /appconfig location if added to service collection before host built
* HasServiceCollectionModuleAttribute has PostStartupValidationAsync when,
* ValidateServicesAddedByAttributes extension method called from service provider,
* PostStartupValidationAsync will be called if all services resolved successfully.
* For instance, DrnContext can apply migrations after service provider services resolved successfully.
* ScopedLog and IScopedLog added to aggregate related log within a scope such as a http request.
## Version 0.2.0
### Breaking Changes
* LifetimeContainer renamed as DrnServiceContainer
* Lifetime attributes moved to DRN.Framework.Utils.DependencyInjection.Attributes namespace
### New Features
* JsonSerializerConfigurationSource added to add dotnet objects to configuration
* RemoteJsonConfigurationSource added to remote settings to configuration (experimental)
* ConnectionStringsCollection added as poco model to serialize connection strings
* StringExtensions added
* ToStream method added to convert strings to in memory stream
* HasServiceCollectionModuleAttribute added
## Version 0.1.0
### Breaking Changes
### New Features
* AppSettings added
* ServiceCollectionExtensions added
* ReplaceInstance
* ReplaceTransient
* ReplaceScoped
* ReplaceSingleton
* Attribute based dependency injection added
* ScopedAttribute, TransientAttribute, SingletonAttribute and LifetimeAttribute added
* ScopedWithKeyAttribute, TransientWithKeyAttribute, SingletonWithKeyAttribute and LifetimeWithKeyAttribute added
* ServiceCollection AddServicesWithAttributes extension added
* ServiceProvider ValidateServicesAddedByAttributes extension added
### Bug Fixes
---
**Semper Progredi: Always Progressive**
## Commit Info
Author: Duran Serkan KILIÇ
Date: 2024-05-19 23:25:32 +0300
Hash: 2c6009a829defc78647603ba828566ea52aeb989