Framework Setup
This commit is contained in:
23
BattleFieldSimulator/packages/DryIoc.4.1.4/CompileTimeDI/CompileTimeRegistrations.Example.cs
vendored
Executable file
23
BattleFieldSimulator/packages/DryIoc.4.1.4/CompileTimeDI/CompileTimeRegistrations.Example.cs
vendored
Executable file
@@ -0,0 +1,23 @@
|
||||
#pragma warning disable 1591
|
||||
|
||||
namespace Example
|
||||
{
|
||||
public interface IService { }
|
||||
|
||||
public class MyService : IService
|
||||
{
|
||||
public MyService(IDependencyA a, DependencyB<string> b, RuntimeDependencyC c) { }
|
||||
}
|
||||
|
||||
public interface IDependencyA { }
|
||||
|
||||
public class DependencyA : IDependencyA { }
|
||||
|
||||
public class DependencyB<T>
|
||||
{
|
||||
}
|
||||
|
||||
public class RuntimeDependencyC
|
||||
{
|
||||
}
|
||||
}
|
||||
58
BattleFieldSimulator/packages/DryIoc.4.1.4/CompileTimeDI/CompileTimeRegistrations.ttinclude
vendored
Executable file
58
BattleFieldSimulator/packages/DryIoc.4.1.4/CompileTimeDI/CompileTimeRegistrations.ttinclude
vendored
Executable file
@@ -0,0 +1,58 @@
|
||||
<#
|
||||
// TODO:
|
||||
// 1. Fill-in method `GetContainerWithRegistrations` below with creation of DryIoc `Container` and registrations.
|
||||
// 2. Specify the resolution roots via `SpecifyResolutionRoots` method, see example below.
|
||||
// 3. Save the "Container.Generated.tt" file. Confirm the Visual Studio prompt if any.
|
||||
// 4. Check the "Container.Generated.cs" for the generated results and issues.
|
||||
//
|
||||
// Note:
|
||||
// - When specifying assembly path, you may use $(SolutionDir), $(ProjectDir), $(Configuration) parameters.
|
||||
//
|
||||
#>
|
||||
<#@ import Namespace="DryIoc" #>
|
||||
<#@ import Namespace="ImTools" #>
|
||||
<#// TODO: Insert the assemblies and namespaces of your services to be registered in container #>
|
||||
<#@ import Namespace="Example" #>
|
||||
<#+
|
||||
// TODO: Specify the container and registrations ...
|
||||
IContainer GetContainerWithRegistrations()
|
||||
{
|
||||
var container = new Container();
|
||||
|
||||
// NOTE: `RegisterDelegate`, `RegisterInstance` and `Use` methods are not supported because of runtime state usage.
|
||||
// Instead you can use `RegisterPlaceholder` to put a hole in the generated object graph, then you fill it in with the runtime registration.
|
||||
|
||||
// TODO: Add the registrations to generate factories for them in compile-time...
|
||||
// for example:
|
||||
container.Register<IService, MyService>();
|
||||
container.Register<IDependencyA, DependencyA>();
|
||||
container.Register(typeof(DependencyB<>));
|
||||
container.RegisterPlaceholder<RuntimeDependencyC>();
|
||||
|
||||
// or from the assembly:
|
||||
// container.RegisterMany(new[] { MyAssembly });
|
||||
|
||||
return container;
|
||||
}
|
||||
|
||||
// TODO: For each passed registration specify what resolution roots it provides, null if none
|
||||
ServiceInfo[] SpecifyResolutionRoots(ServiceRegistrationInfo reg)
|
||||
{
|
||||
return reg.AsResolutionRoot ? reg.ToServiceInfo().One() : null;
|
||||
}
|
||||
|
||||
// TODO: Explicitly specified roots to generate ...
|
||||
ServiceInfo[] CustomResolutionRoots =
|
||||
{
|
||||
// for example:
|
||||
ServiceInfo.Of<Example.IService>(),
|
||||
};
|
||||
|
||||
// TODO: Specify the namespace to go into `using` instead of qualify the type all the times,
|
||||
// You may generate the Container.Generated.cs first, then look what you want to move to using
|
||||
string[] NamespaceUsings =
|
||||
{
|
||||
"Example",
|
||||
//"Foo.Bar.Buzz",
|
||||
};
|
||||
#>
|
||||
281
BattleFieldSimulator/packages/DryIoc.4.1.4/CompileTimeDI/Container.Generated.tt
vendored
Executable file
281
BattleFieldSimulator/packages/DryIoc.4.1.4/CompileTimeDI/Container.Generated.tt
vendored
Executable file
@@ -0,0 +1,281 @@
|
||||
// <auto-generated/>
|
||||
#if !PCL && !NETSTANDARD1_0 && !NETSTANDARD1_1 && !NETSTANDARD1_2 && !NETSTANDARD1_3 && !NETSTANDARD1_4 && !NETSTANDARD1_5
|
||||
/*
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2016-2020 Maksim Volkau
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
*/
|
||||
<#@ template debug="false" hostspecific="true" language="C#" #>
|
||||
<#@ output extension=".cs" #>
|
||||
<#@ CleanupBehavior processor="T4VSHost" CleanupAfterProcessingtemplate="true" #>
|
||||
<#@ assembly Name="System.Core" #>
|
||||
<#@ assembly Name="System.Runtime" #>
|
||||
<#@ assembly Name="$(ExpressionToCodeLibAssembly)" #>
|
||||
<#@ assembly Name="$(TargetPath)" #>
|
||||
<#@ import Namespace="ExpressionToCodeLib" #>
|
||||
<#@ import Namespace="System.Linq" #>
|
||||
<#@ import Namespace="System.Linq.Expressions" #>
|
||||
<#@ import Namespace="DryIoc" #>
|
||||
<#@ import Namespace="ImTools" #>
|
||||
<#@ include File="CompileTimeRegistrations.ttinclude" #>
|
||||
<#
|
||||
var container = GetContainerWithRegistrations().With(rules => rules.ForExpressionGeneration());
|
||||
|
||||
var includeVariants = container.Rules.VariantGenericTypesInResolvedCollection;
|
||||
|
||||
var result = container.GenerateResolutionExpressions(x => x.SelectMany(r =>
|
||||
SpecifyResolutionRoots(r).EmptyIfNull()).Concat(CustomResolutionRoots.EmptyIfNull()));
|
||||
|
||||
var exprToCode = ExpressionToCodeConfiguration.DefaultCodeGenConfiguration
|
||||
.WithObjectStringifier(ObjectStringify.WithFullTypeNames);
|
||||
|
||||
string RemoveUsings(string source)
|
||||
{
|
||||
foreach (var x in NamespaceUsings)
|
||||
source = source.Replace(x + ".", "");
|
||||
return source;
|
||||
}
|
||||
|
||||
string Code(object x) =>
|
||||
x == null ? "null" :
|
||||
x is Expression ? RemoveUsings(exprToCode.ToCode((Expression)x)) :
|
||||
x is Request ? Code(container.GetRequestExpression((Request)x).ToExpression()) :
|
||||
Code(container.GetConstantExpression(x, x.GetType(), true).ToExpression());
|
||||
|
||||
string GetTypeNameOnly(string typeName) => typeName.Split('`').First().Split('.').Last();
|
||||
|
||||
string OptArg(string arg) => arg == "null" ? "" : ", " + arg;
|
||||
|
||||
var rootCodes = result.Roots.Select((r, i) =>
|
||||
new { ServiceType = r.Key.ServiceType,
|
||||
ServiceTypeCode = Code(r.Key.ServiceType),
|
||||
ServiceKeyCode = Code(r.Key.ServiceKey),
|
||||
RequiredServiceTypeCode = Code(r.Key.Details.RequiredServiceType),
|
||||
ExpressionCode = Code(r.Value.Body),
|
||||
CreateMethodName = "Get_" + i + "_" + GetTypeNameOnly(r.Key.ServiceType.Name) });
|
||||
|
||||
var depCodes = result.ResolveDependencies.Select((r, i) =>
|
||||
new { ServiceType = Code(r.Key.ServiceType),
|
||||
ServiceKey = Code(r.Key.ServiceKey), ServiceKeyObject = r.Key.ServiceKey,
|
||||
Expression = Code(r.Value),
|
||||
RequiredServiceType = Code(r.Key.RequiredServiceType),
|
||||
PreResolveParent = Code(r.Key.Parent),
|
||||
CreateMethodName = "GetDep_" + i + "_" + GetTypeNameOnly(r.Key.ServiceType.Name) });
|
||||
#>
|
||||
/*
|
||||
========================================================================================================
|
||||
NOTE: The code below is generated automatically at compile-time and not supposed to be changed by hand.
|
||||
========================================================================================================
|
||||
<# var errCount = result.Errors.Count;
|
||||
if (errCount == 0) { #>
|
||||
Generation is completed successfully.
|
||||
<# } else { #>
|
||||
There are <#=errCount#> generation issues (may be not an error dependent on context):
|
||||
|
||||
The issues with run-time registrations may be solved by `container.RegisterPlaceholder<T>()`
|
||||
in Registrations.ttinclude. Then you can replace placeholders using `DryIocZero.Container.Register`
|
||||
at runtime.
|
||||
|
||||
<# } #>
|
||||
--------------------------------------------------------------------------------------------------------
|
||||
<# var eNum = 0;
|
||||
foreach(var e in result.Errors) { #>
|
||||
<#=++eNum#>. <#=e.Key#>
|
||||
Error: <#=e.Value.Message#>
|
||||
<# } #>
|
||||
*/
|
||||
|
||||
using System;
|
||||
using System.Linq; // for Enumerable.Cast method required by LazyEnumerable<T>
|
||||
using System.Collections.Generic;
|
||||
using System.Threading;
|
||||
using ImTools;
|
||||
|
||||
// Specified `NamespaceUsings` if any:
|
||||
<# foreach (var ns in NamespaceUsings) {#>
|
||||
using <#=ns#>;
|
||||
<#}#>
|
||||
|
||||
namespace DryIoc
|
||||
{
|
||||
partial class Container
|
||||
{
|
||||
partial void GetLastGeneratedFactoryID(ref int lastFactoryID)
|
||||
{
|
||||
lastFactoryID = <#=Factory.GetNextID()#>; // generated: equals to the last used Factory.FactoryID
|
||||
}
|
||||
|
||||
partial void ResolveGenerated(ref object service, Type serviceType)
|
||||
{
|
||||
<#
|
||||
var index = 0;
|
||||
foreach (var root in rootCodes.Where(f => f.ServiceKeyCode == "null"))
|
||||
{
|
||||
if (index++ > 0) WriteLine(@"
|
||||
else");
|
||||
#>
|
||||
if (serviceType == <#=root.ServiceTypeCode#>)
|
||||
service = <#=root.CreateMethodName#>(this);
|
||||
<#
|
||||
}
|
||||
#>
|
||||
}
|
||||
|
||||
partial void ResolveGenerated(ref object service,
|
||||
Type serviceType, object serviceKey, Type requiredServiceType, Request preRequestParent, object[] args)
|
||||
{
|
||||
<#
|
||||
index = 0;
|
||||
foreach (var rootGroup in rootCodes.Where(x => x.ServiceKeyCode != "null").GroupBy(x => x.ServiceTypeCode))
|
||||
{
|
||||
if (index++ > 0) WriteLine(@"
|
||||
else");
|
||||
#>
|
||||
if (serviceType == <#=rootGroup.Key#>)
|
||||
{
|
||||
<#
|
||||
var innerIndex = 0;
|
||||
foreach (var root in rootGroup)
|
||||
{
|
||||
if (innerIndex++ > 0) WriteLine(@"
|
||||
else");
|
||||
#>
|
||||
if (<#=root.ServiceKeyCode#>.Equals(serviceKey))
|
||||
service = <#=root.CreateMethodName#>(this);
|
||||
<#
|
||||
}
|
||||
|
||||
#>
|
||||
}
|
||||
<#
|
||||
}
|
||||
#>
|
||||
<#
|
||||
foreach (var depGroup in depCodes.GroupBy(x => x.ServiceType))
|
||||
{
|
||||
if (index++ > 0) WriteLine(@"
|
||||
else");
|
||||
#>
|
||||
if (serviceType == <#=depGroup.Key#>)
|
||||
{
|
||||
<#
|
||||
var innerIndex = 0;
|
||||
foreach (var dep in depGroup)
|
||||
{
|
||||
if (innerIndex++ > 0) WriteLine(@"
|
||||
else");
|
||||
#>
|
||||
if (<#=dep.ServiceKeyObject == null ? "serviceKey == null"
|
||||
: dep.ServiceKeyObject is DefaultKey ? "(serviceKey == null || " + dep.ServiceKey + ".Equals(serviceKey))"
|
||||
: dep.ServiceKey + ".Equals(serviceKey)"#> &&
|
||||
requiredServiceType == <#= dep.RequiredServiceType #> &&
|
||||
Equals(preRequestParent, <#= dep.PreResolveParent #>))
|
||||
service = <#=dep.CreateMethodName#>(this);
|
||||
<#
|
||||
}
|
||||
#>
|
||||
}
|
||||
<#
|
||||
}
|
||||
#>
|
||||
}
|
||||
|
||||
partial void ResolveManyGenerated(ref IEnumerable<ResolveManyResult> services, Type serviceType)
|
||||
{
|
||||
services = ResolveManyGenerated(serviceType);
|
||||
}
|
||||
|
||||
private IEnumerable<ResolveManyResult> ResolveManyGenerated(Type serviceType)
|
||||
{
|
||||
<#
|
||||
if (!rootCodes.Any())
|
||||
{
|
||||
#>
|
||||
yield break;
|
||||
<#
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (var rootGroup in rootCodes.GroupBy(x => x.ServiceType))
|
||||
{
|
||||
#>
|
||||
if (serviceType == <#=rootGroup.First().ServiceTypeCode#>)
|
||||
{
|
||||
<#
|
||||
foreach (var root in rootGroup)
|
||||
{
|
||||
#>
|
||||
yield return ResolveManyResult.Of(<#=root.CreateMethodName#><#=OptArg(root.ServiceKeyCode)#><#=OptArg(root.RequiredServiceTypeCode)#>);
|
||||
<#
|
||||
}
|
||||
|
||||
if (includeVariants && rootGroup.Key.IsGeneric())
|
||||
{
|
||||
var sourceType = rootGroup.Key;
|
||||
var variants = rootCodes
|
||||
.Where(x => x.ServiceType.IsGeneric() &&
|
||||
x.ServiceType.GetGenericTypeDefinition() == sourceType.GetGenericTypeDefinition() &&
|
||||
x.ServiceType != sourceType && x.ServiceType.IsAssignableTo(sourceType));
|
||||
foreach (var variant in variants)
|
||||
{
|
||||
#>
|
||||
yield return ResolveManyResult.Of(<#=variant.CreateMethodName#><#=OptArg(variant.ServiceKeyCode)#><#=OptArg(variant.RequiredServiceTypeCode)#>); // co-variant
|
||||
<#
|
||||
}
|
||||
}
|
||||
#>
|
||||
}
|
||||
|
||||
<#
|
||||
}
|
||||
}
|
||||
#>
|
||||
}
|
||||
|
||||
<#
|
||||
foreach (var root in rootCodes)
|
||||
{
|
||||
#>
|
||||
// <#=root.ServiceTypeCode#>
|
||||
internal static object <#=root.CreateMethodName#>(IResolverContext r)
|
||||
{
|
||||
return <#=root.ExpressionCode#>;
|
||||
}
|
||||
|
||||
<#
|
||||
}
|
||||
#>
|
||||
<#
|
||||
foreach (var dep in depCodes)
|
||||
{
|
||||
#>
|
||||
// <#=dep.ServiceType#>
|
||||
internal static object <#=dep.CreateMethodName#>(IResolverContext r)
|
||||
{
|
||||
return <#=dep.Expression#>;
|
||||
}
|
||||
|
||||
<#
|
||||
}
|
||||
#>
|
||||
}
|
||||
}
|
||||
#endif
|
||||
Reference in New Issue
Block a user