Spencer.NET
1.0.0
See the version list below for details.
dotnet add package Spencer.NET --version 1.0.0
NuGet\Install-Package Spencer.NET -Version 1.0.0
<PackageReference Include="Spencer.NET" Version="1.0.0" />
paket add Spencer.NET --version 1.0.0
#r "nuget: Spencer.NET, 1.0.0"
// Install Spencer.NET as a Cake Addin #addin nuget:?package=Spencer.NET&version=1.0.0 // Install Spencer.NET as a Cake Tool #tool nuget:?package=Spencer.NET&version=1.0.0
Spencer.NET
Open Source project of smart IoC Container made by programmer for programmer.
Is made with a view to creating class libraries.
Author
Kacper Faber, Poland
Requires
NET STANDARD 2.0 or newest
.NET CORE 2.0 or newest
.NET FRAMEWORK 4.61 or newest
Versions
- 1.0 (29.04.2020)
Usage
- Installing package
- Adding using statement
- Creating new Container
- Creating new ReadOnlyContainer
- Creating Storage
- Attributes
- Troubleshooting
- Using parametrized constructors
- Factories
- Inject, TryInject, Auto
Installing package
Spencer.NET is avaible on nuget.org.
You can use one of follow commands.
dotnet add package Spencer.NET
Install-Package Spencer.NET
Adding using
Spencer.NET using one statement for every feature.
It is it.
using Spencer.NET;
Create Container
Constructors of both of containers are too long to
writing it by contributor programmer.
You can use tested and safely ContainerFactory class
IContainer container = ContainerFactory.Container();
Create ReadOnlyContainer
Constructors of both of containers are too long to
writing it by contributor programmer.
You can use tested and safely ContainerFactory class
This container cannot be updated in him lifetime
You should provide instance of Storage class
Prefered way is using StorageBuilder
IReadOnlyContainer container = ContainerFactory.ReadOnlyContainer(storage);
Create Storage
ReadOnlyContainer cannot be updated in him lifetime.
To provides static registrations, you have to use instance of Storage
class
Prefered way is using StorageBuilder
class.
StorageBuilder.Build():IStorage
Returns Storage instance
StorageBuilder.Register<T>():StorageBuilder
Registering generic T as class or interface
StorageBuilder.Register(Type):StorageBuilder
Registering class or interface
StorageBuilder.Register<T>(params object[]):StorageBuilder
Registering generic T as class or interface with
given parameters to constructor
with compatible parameters
StorageBuilder.Register(Type, params object[]):StorageBuilder
Registering class or interface using constructor
with compatible parameters
StorageBuilder.RegisterObject(object):StorageBuilder
Registering class with instance gived in parameter.
Registration type will be taken from unboxed instance.
StorageBuilder.RegisterObject<T>(T):StorageBuilder
Registering class with instance of gived in parameter.
Registration type will be taken from T.
StorageBuilder.RegisterAssembly(Assembly):StorageBuilder
Registering assembly types.
StorageBuilder.RegisterAssembly(AssemblyName):StorageBuilder
Registering assembly types
StorageBuilder.RegisterAssemblies(params Assembly[]):StorageBuilder
Registering assembly types
StorageBuilder.RegisterAssemblies(params AssemblyName[]):StorageBuilder
Registering assembly types
Attributes
SingleInstance
service will using single instance of classMultiInstance
service will create a new instance for each trying to getAutoValue
service will be instantiate on registering processExclude (Type)
excluding type from registration.ServiceConstructor
pointing to default constructor for class, if any constructor will be find automaticallyFactory
pointing to static method, which will be used to instantiate new instance of classFactoryResult (Type)
expanding factory method for good type which actually is producing in this method
Troubleshooting
[SingleInstance]
[MultiInstance]
class Test
{
}
// Test will be registered as SingleInstance.
class Test
{
}
// Test will be registered as SingleInstance
// SingleInstance is default
class Test
{
}
// Test will be registered as not AutoValue,
// Class will be instantiate, on first trying to get
[MultiInstance]
class Test
{
}
Test instance = new Test();
IContainer container = ContainerFactory.Container();
container.RegisterObject(instance);
// Test will be registered as MultiInstace
// Given instance will be ever returns using Resolve methods.
class Test
{
[Factory]
public static Test FactoryMethod() => new Test();
[ServiceConstructor]
public Test()
{
}
}
// Factory always be checked first.
// In this situation Test will be instantiate using factory
Parametrized Constructors
Mechanism for finding constructor always will be picking accessible and
with the smallest count of parameters he have, or he could have.
You would use ServiceConstructor
attribute?
If you want dynamically choose constructor you would to use,
i'm providing functionality to find constructor by given parameters.
Lets see the sample... :>
class Test
{
// #1
public Test(int x) {}
// #2
public Test(int x, int y) {}
// #3
public Test(string str, bool b) {}
}
// Container.Register<Test>(0);
// Will invoke #1 constructor
// params
// x = 0
// Container.Register<Test>(1, 2);
// Will use #2 constructor
// params
// x = 1,
// y = 2
// Container.Register<Test>(true, "Hello World!");
// Will use #3 constructor
// params
// str = "Hello World!"
// b = true
Factories
Factories is a static methods generating instance of a class.
They can returns interface, if they will have a
FactoryResult(Type)
attribute,
which will be pointing to the valid returns type.
They can take dependencies as their parameters
class Test
{
Test() {}
[Factory]
public static Test FactoryMethod() => new Test();
}
interface ITest
{
}
class Test : ITest
{
Test() {}
[Factory]
[FactoryResult(typeof(Test))
public static ITest FactoryMethod() => new Test();
}
Injections
Spencer.NET want to help you. If you want, you cannot inject everything in constructor.
I am providing attributes Inject
, TryInject
and Auto
.
Inject way is not recommended for good Dependency Injection
Injections
Inject
trying to resolve instance from self Container,
if could not found any matching will throw
ResolveException
TryInject
trying to resolve instance from self Container,
if could not found any matching set variable to
null
Auto
initializing simple types
class OldWay
{
public IEnumerable<int> Ints { get; set; }
public IDep Dep { get; set; }
public OldWay(IDep dep)
{
Dep = dep;
Ints = new List<int>();
}
}
class NewWay
{
[Auto]
public IEnumerable<int> Ints { get; set; }
[Inject]
public IDep Dep { get; set; }
}
Product | Versions Compatible and additional computed target framework versions. |
---|---|
.NET | net5.0 was computed. net5.0-windows was computed. net6.0 was computed. 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. |
.NET Core | netcoreapp2.0 was computed. netcoreapp2.1 was computed. netcoreapp2.2 was computed. netcoreapp3.0 was computed. netcoreapp3.1 was computed. |
.NET Standard | netstandard2.0 is compatible. netstandard2.1 was computed. |
.NET Framework | net461 was computed. net462 was computed. net463 was computed. net47 was computed. net471 was computed. net472 was computed. net48 was computed. net481 was computed. |
MonoAndroid | monoandroid was computed. |
MonoMac | monomac was computed. |
MonoTouch | monotouch was computed. |
Tizen | tizen40 was computed. tizen60 was computed. |
Xamarin.iOS | xamarinios was computed. |
Xamarin.Mac | xamarinmac was computed. |
Xamarin.TVOS | xamarintvos was computed. |
Xamarin.WatchOS | xamarinwatchos was computed. |
This package has no dependencies.
NuGet packages
This package is not used by any NuGet packages.
GitHub repositories
This package is not used by any popular GitHub repositories.
Version | Downloads | Last updated | |
---|---|---|---|
1.3.0 | 226 | 7/25/2023 | |
1.2.0 | 160 | 7/25/2023 | |
1.1.29500 | 1,099 | 7/18/2020 | |
1.1.3000 | 476 | 7/23/2020 | |
1.1.2955 | 452 | 7/18/2020 | |
1.1.2900 | 440 | 7/18/2020 | |
1.1.2876 | 428 | 7/18/2020 | |
1.1.2453 | 450 | 7/14/2020 | |
1.0.75 | 490 | 6/16/2020 | |
1.0.6 | 442 | 6/13/2020 | |
1.0.5 | 499 | 6/12/2020 | |
1.0.2.2 | 475 | 5/27/2020 | |
1.0.2.1 | 439 | 5/26/2020 | |
1.0.2 | 448 | 5/26/2020 | |
1.0.1 | 469 | 4/30/2020 | |
1.0.0 | 453 | 4/29/2020 |