Initial commit
This commit is contained in:
parent
59307bf28e
commit
7326ff6684
28
.vscode/launch.json
vendored
Normal file
28
.vscode/launch.json
vendored
Normal file
@ -0,0 +1,28 @@
|
||||
{
|
||||
// Use IntelliSense to find out which attributes exist for C# debugging
|
||||
// Use hover for the description of the existing attributes
|
||||
// For further information visit https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md
|
||||
"version": "0.2.0",
|
||||
"configurations": [
|
||||
{
|
||||
"name": ".NET Core Launch (console)",
|
||||
"type": "coreclr",
|
||||
"request": "launch",
|
||||
"preLaunchTask": "build",
|
||||
// If you have changed target frameworks, make sure to update the program path.
|
||||
"program": "${workspaceFolder}/bin/Debug/netcoreapp2.1/Playground.dll",
|
||||
"args": [],
|
||||
"cwd": "${workspaceFolder}",
|
||||
// For more information about the 'console' field, see https://github.com/OmniSharp/omnisharp-vscode/blob/master/debugger-launchjson.md#console-terminal-window
|
||||
"console": "internalConsole",
|
||||
"stopAtEntry": false,
|
||||
"internalConsoleOptions": "openOnSessionStart"
|
||||
},
|
||||
{
|
||||
"name": ".NET Core Attach",
|
||||
"type": "coreclr",
|
||||
"request": "attach",
|
||||
"processId": "${command:pickProcess}"
|
||||
}
|
||||
,]
|
||||
}
|
15
.vscode/tasks.json
vendored
Normal file
15
.vscode/tasks.json
vendored
Normal file
@ -0,0 +1,15 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "build",
|
||||
"command": "dotnet",
|
||||
"type": "process",
|
||||
"args": [
|
||||
"build",
|
||||
"${workspaceFolder}/Playground.csproj"
|
||||
],
|
||||
"problemMatcher": "$msCompile"
|
||||
}
|
||||
]
|
||||
}
|
28
Program.cs
Normal file
28
Program.cs
Normal file
@ -0,0 +1,28 @@
|
||||
using System;
|
||||
|
||||
namespace Playground
|
||||
{
|
||||
internal static class Program
|
||||
{
|
||||
private static void Main()
|
||||
{
|
||||
Console.WriteLine("Small dependency injection example.");
|
||||
var injector = new SmallInjector();
|
||||
injector.RegisterType<ServiceOne, IServiceOne>(true);
|
||||
injector.RegisterType<ServiceTwo, IServiceTwo>(true);
|
||||
injector.RegisterType<UsefulClass>(false);
|
||||
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("Resolve class instances.");
|
||||
var useful1 = injector.Resolve<UsefulClass>();
|
||||
var useful2 = injector.Resolve<UsefulClass>();
|
||||
var useful3 = injector.Resolve<UsefulClass>();
|
||||
Console.WriteLine();
|
||||
Console.WriteLine("Run test methods.");
|
||||
useful1.TestTheServices();
|
||||
useful2.TestTheServices();
|
||||
useful3.TestTheServices();
|
||||
Console.ReadLine();
|
||||
}
|
||||
}
|
||||
}
|
17
RegisteredType.cs
Normal file
17
RegisteredType.cs
Normal file
@ -0,0 +1,17 @@
|
||||
using System;
|
||||
|
||||
namespace Playground
|
||||
{
|
||||
public class RegisteredType
|
||||
{
|
||||
public RegisteredType(Type concreteType, bool isSingleton)
|
||||
{
|
||||
ConcreteType = concreteType;
|
||||
IsSingleton = isSingleton;
|
||||
}
|
||||
|
||||
public readonly bool IsSingleton;
|
||||
public readonly Type ConcreteType;
|
||||
public object SingletonInstance { get; set; }
|
||||
}
|
||||
}
|
22
ServiceOne.cs
Normal file
22
ServiceOne.cs
Normal file
@ -0,0 +1,22 @@
|
||||
using System;
|
||||
|
||||
namespace Playground
|
||||
{
|
||||
public class ServiceOne : IServiceOne
|
||||
{
|
||||
private readonly Guid _guid;
|
||||
|
||||
public ServiceOne()
|
||||
{
|
||||
_guid = Guid.NewGuid();
|
||||
Console.WriteLine(nameof(ServiceOne) + ".ctor\t\tId: " + _guid);
|
||||
}
|
||||
|
||||
public override string ToString() => nameof(ServiceOne) + ".ToString()\tId: " + _guid;
|
||||
}
|
||||
|
||||
public interface IServiceOne
|
||||
{
|
||||
|
||||
}
|
||||
}
|
22
ServiceTwo.cs
Normal file
22
ServiceTwo.cs
Normal file
@ -0,0 +1,22 @@
|
||||
using System;
|
||||
|
||||
namespace Playground
|
||||
{
|
||||
public class ServiceTwo : IServiceTwo
|
||||
{
|
||||
private readonly Guid _guid;
|
||||
|
||||
public ServiceTwo()
|
||||
{
|
||||
_guid = Guid.NewGuid();
|
||||
Console.WriteLine(nameof(ServiceTwo) + ".ctor\t\tId: " + _guid);
|
||||
}
|
||||
|
||||
public override string ToString() => nameof(ServiceTwo) + ".ToString()\tId: " + _guid;
|
||||
|
||||
}
|
||||
|
||||
public interface IServiceTwo
|
||||
{
|
||||
}
|
||||
}
|
47
SmallInjector.cs
Normal file
47
SmallInjector.cs
Normal file
@ -0,0 +1,47 @@
|
||||
using System;
|
||||
using System.Collections;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using System.Linq.Expressions;
|
||||
using System.Reflection;
|
||||
namespace Playground
|
||||
{
|
||||
public class SmallInjector
|
||||
{
|
||||
private readonly Dictionary<Type, RegisteredType> _container = new Dictionary<Type, RegisteredType>();
|
||||
|
||||
public void RegisterType<TService, TInterface>(bool isSingleton)
|
||||
{
|
||||
_container.Add(typeof(TInterface), new RegisteredType(typeof(TService), isSingleton));
|
||||
}
|
||||
|
||||
public void RegisterType<TService>(bool isSingleton) => RegisterType<TService, TService>(isSingleton);
|
||||
|
||||
public TService Resolve<TService>() => (TService)Resolve(typeof(TService));
|
||||
|
||||
public object Resolve(Type serviceInterface)
|
||||
{
|
||||
if (!_container.TryGetValue(serviceInterface, out var registeredType))
|
||||
{
|
||||
throw new Exception("Can't resolve dependency " + serviceInterface);
|
||||
}
|
||||
|
||||
if (registeredType.IsSingleton && registeredType.SingletonInstance != null)
|
||||
return registeredType.SingletonInstance;
|
||||
var constructor = registeredType.ConcreteType.GetConstructors()[0];
|
||||
var parameters = constructor.GetParameters();
|
||||
var constructorParameters = new object[parameters.Length];
|
||||
for (var i = 0; i < parameters.Length; i++)
|
||||
{
|
||||
constructorParameters[i] = Resolve(parameters[i].ParameterType);
|
||||
}
|
||||
|
||||
if (registeredType.IsSingleton)
|
||||
{
|
||||
return registeredType.SingletonInstance ?? (registeredType.SingletonInstance = constructor.Invoke(constructorParameters));
|
||||
}
|
||||
return constructor.Invoke(constructorParameters);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
8
SmallInjectorDemo.csproj
Normal file
8
SmallInjectorDemo.csproj
Normal file
@ -0,0 +1,8 @@
|
||||
<Project Sdk="Microsoft.NET.Sdk">
|
||||
<PropertyGroup>
|
||||
<OutputType>Exe</OutputType>
|
||||
<TargetFramework>netcoreapp2.1</TargetFramework>
|
||||
<AssemblyName>SmallInjectorDemo</AssemblyName>
|
||||
<RootNamespace>SmallInjectorDemo</RootNamespace>
|
||||
</PropertyGroup>
|
||||
</Project>
|
37
SmallInjectorDemo.sln
Normal file
37
SmallInjectorDemo.sln
Normal file
@ -0,0 +1,37 @@
|
||||
|
||||
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||
# Visual Studio 15
|
||||
VisualStudioVersion = 15.0.26124.0
|
||||
MinimumVisualStudioVersion = 15.0.26124.0
|
||||
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SmallInjectorDemo", "SmallInjectorDemo.csproj", "{620CC001-7DF9-4233-AFC2-187FD9144835}"
|
||||
EndProject
|
||||
Global
|
||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||
Debug|Any CPU = Debug|Any CPU
|
||||
Debug|x64 = Debug|x64
|
||||
Debug|x86 = Debug|x86
|
||||
Release|Any CPU = Release|Any CPU
|
||||
Release|x64 = Release|x64
|
||||
Release|x86 = Release|x86
|
||||
EndGlobalSection
|
||||
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||
{620CC001-7DF9-4233-AFC2-187FD9144835}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
|
||||
{620CC001-7DF9-4233-AFC2-187FD9144835}.Debug|Any CPU.Build.0 = Debug|Any CPU
|
||||
{620CC001-7DF9-4233-AFC2-187FD9144835}.Debug|x64.ActiveCfg = Debug|Any CPU
|
||||
{620CC001-7DF9-4233-AFC2-187FD9144835}.Debug|x64.Build.0 = Debug|Any CPU
|
||||
{620CC001-7DF9-4233-AFC2-187FD9144835}.Debug|x86.ActiveCfg = Debug|Any CPU
|
||||
{620CC001-7DF9-4233-AFC2-187FD9144835}.Debug|x86.Build.0 = Debug|Any CPU
|
||||
{620CC001-7DF9-4233-AFC2-187FD9144835}.Release|Any CPU.ActiveCfg = Release|Any CPU
|
||||
{620CC001-7DF9-4233-AFC2-187FD9144835}.Release|Any CPU.Build.0 = Release|Any CPU
|
||||
{620CC001-7DF9-4233-AFC2-187FD9144835}.Release|x64.ActiveCfg = Release|Any CPU
|
||||
{620CC001-7DF9-4233-AFC2-187FD9144835}.Release|x64.Build.0 = Release|Any CPU
|
||||
{620CC001-7DF9-4233-AFC2-187FD9144835}.Release|x86.ActiveCfg = Release|Any CPU
|
||||
{620CC001-7DF9-4233-AFC2-187FD9144835}.Release|x86.Build.0 = Release|Any CPU
|
||||
EndGlobalSection
|
||||
GlobalSection(SolutionProperties) = preSolution
|
||||
HideSolutionNode = FALSE
|
||||
EndGlobalSection
|
||||
GlobalSection(ExtensibilityGlobals) = postSolution
|
||||
SolutionGuid = {1A146B09-F1B0-4A1E-B396-739788B6A68E}
|
||||
EndGlobalSection
|
||||
EndGlobal
|
29
UsefulClass.cs
Normal file
29
UsefulClass.cs
Normal file
@ -0,0 +1,29 @@
|
||||
using System;
|
||||
|
||||
namespace Playground
|
||||
{
|
||||
public class UsefulClass
|
||||
{
|
||||
private readonly IServiceOne _service;
|
||||
private readonly IServiceTwo _service2;
|
||||
private readonly Guid _guid;
|
||||
|
||||
public UsefulClass(IServiceOne service, IServiceTwo service2)
|
||||
{
|
||||
_service = service;
|
||||
_service2 = service2;
|
||||
_guid = Guid.NewGuid();
|
||||
Console.WriteLine(nameof(UsefulClass) + ".ctor\tId: " + _guid);
|
||||
}
|
||||
|
||||
public void TestTheServices()
|
||||
{
|
||||
Console.WriteLine(ToString());
|
||||
Console.WriteLine(_service.ToString());
|
||||
Console.WriteLine(_service2.ToString());
|
||||
}
|
||||
|
||||
public override string ToString() => nameof(UsefulClass) + ".ToString()\tId: " + _guid;
|
||||
|
||||
}
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user