Bindicate 1.2.0
See the version list below for details.
dotnet add package Bindicate --version 1.2.0
NuGet\Install-Package Bindicate -Version 1.2.0
<PackageReference Include="Bindicate" Version="1.2.0" />
paket add Bindicate --version 1.2.0
#r "nuget: Bindicate, 1.2.0"
// Install Bindicate as a Cake Addin
#addin nuget:?package=Bindicate&version=1.2.0
// Install Bindicate as a Cake Tool
#tool nuget:?package=Bindicate&version=1.2.0
Bindicate ๐งท
'A blend of "Bind" and "Indicate"'.
Features ๐
- Automatic registration of services using custom attributes.
- Automatic registration and configuration of options via
IOptions<T>
. - No need for explicit interface specification for class-only registrations.
- Provides clear visibility and reduces boilerplate code.
- Simple integration with the built-in .NET IoC container.
Supported types
<center>
| Type | Supported| |----------------|----------| |AddTransient |โ๏ธ | |TryAddTransient |โ๏ธ | |AddScoped |โ๏ธ | |TryAddScoped |โ๏ธ | |AddSingleton |โ๏ธ | |TryAddSingleton |โ๏ธ | |TryAddEnumerable|โ | </center>
Installation ๐ฆ
Via NuGet
Install-Package Bindicate
or
dotnet add package Bindicate
Usage
Autowire dependencies
Register Services
Add this line in a project to register all decorated services. You can repeat this line and pass any assembly.
To also configure options, use .WithOptions()
.
You can also use the ServiceCollectionExtension
pattern and use IConfiguration
as a parameters for your extension method if they have options to register.
Example in host project
// Register all decorated services in the current project
builder.Services
.AddAutowiringForAssembly(Assembly.GetExecutingAssembly())
.Register();
// Also register Options as IOptions<T>
builder.Services
.AddAutowiringForAssembly(Assembly.GetExecutingAssembly())
.WithOptions(Configuration) //Pass builder.Configuration here
.Register();
// Register types and options from referenced project
builder.Services
.AddAutowiringForAssembly(Assembly.GetAssembly(typeof(IInterface)))
.WithOptions(Configuration)
.Register();
Example with ServiceCollectionExtensions
// Hosting project:
var configuration = builder.Configuration;
builder.Services.AddSecondProject(configuration);
// In other project
public static IServiceCollection AddSecondProject(this IServiceCollection services, IConfiguration configuration)
{
services.AddAutowiringForAssembly(Assembly.GetExecutingAssembly())
.WithOptions(configuration)
.Register();
return services;
}
Decorate your services:
Basic usage
For class-only registrations:
Simple decorate your class with the attribute to register. You can use an attribute for a specific lifetime.
[AddTransient]
public class SimpleTaskRunner
{
public void RunTask()
{
// ...
}
}
[TryAddSingleton]
public class SimpleService
{
public void DoThing()
{
// ...
}
}
When using interfaces:
Decorate your class with the attribute and provide the interface
[AddScoped(typeof(IMyTaskRunner))]
public class TaskRunner : IMyTaskRunner
{
public void Run()
{
// ...
}
}
public interface IMyTaskRunner
{
void Run();
}
Options Registration
Decorate your class containing the options with [RegisterOptions]
and specify the corresponding section in appsettings.json
.
[RegisterOptions("testOptions")]
public class TestOptions
{
public string Test { get; set; } = "";
}
//appsettings.json:
{
"testOptions": {
"test": "test"
}
}
Now you can use this value when injection IOptions<TestOptions> in your service
Generics
Define a generic interface:
Decorate the generic interface with the [RegisterGenericInterface]
attribute.
[RegisterGenericInterface]
public interface IRepository<T> where T : BaseEntity
{
void add(T entity);
}
Create the implementation:
[AddTransient(typeof(IRepository<>))]
public class Repository<T> : IRepository<T> where T : BaseEntity
{
public Repository()
{
}
public void add(T entity)
{
// Implementation here
}
}
How to use
You can now resolve instances of this type from IServiceProvider
var customerRepo = serviceProvider.GetService<IRepository<Customer>>();
var productRepo = serviceProvider.GetService<IRepository<Product>>();
Both customerRepo and productRepo will be instances of Repository<T> but will operate on Customer and Product types, respectively.
License
This project is licensed under the MIT license.
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net6.0 is compatible. net6.0-android was computed. net6.0-ios was computed. net6.0-maccatalyst was computed. net6.0-macos was computed. net6.0-tvos was computed. net6.0-windows was computed. net7.0 was computed. net7.0-android was computed. net7.0-ios was computed. net7.0-maccatalyst was computed. net7.0-macos was computed. net7.0-tvos was computed. net7.0-windows was computed. net8.0 was computed. 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. |
-
net6.0
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Add support for IOptions