Skip to content

Commit ae4e6de

Browse files
committed
feat: add SafeToString method and update dependency resolution logic
1 parent a2b9757 commit ae4e6de

5 files changed

Lines changed: 48 additions & 39 deletions

File tree

.github/workflows/nuget-push.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ jobs:
3333
dotnet pack Depository.Extensions.DependencyInjection/Depository.Extensions.DependencyInjection.csproj -c Release -o Packages/
3434
3535
- name: Publish Packages to Artifacts
36-
uses: actions/upload-artifact@v3.1.1
36+
uses: actions/upload-artifact@v4
3737
with:
3838
name: packages
3939
path: Packages

Depository.Core/Depository.Resolve.cs

Lines changed: 39 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -284,8 +284,25 @@ private object ResolveTypeToObject(Type implementType, DependencyResolveOption?
284284

285285

286286
var parameterInfos = constructorInfo.GetParameters();
287-
var parameters = new List<object>();
287+
var parameters = ResolveParameterInfos(implementType, parameterInfos, option);
288+
289+
var dependencyImpl = constructorInfo.Invoke(parameters.ToArray());
290+
if (option?.FatherImplementations is { Count: > 0 })
291+
{
292+
foreach (var kvp in option.FatherImplementations)
293+
{
294+
_fatherToChildRelation.GetOrCreateValue(kvp.Value).Add(new WeakReference(dependencyImpl));
295+
_childToFatherRelation.GetOrCreateValue(dependencyImpl).Add(new WeakReference(kvp.Value));
296+
}
297+
}
298+
299+
return dependencyImpl;
300+
}
301+
302+
public List<object> ResolveParameterInfos(Type implementType, ParameterInfo[] parameterInfos, DependencyResolveOption? option)
303+
{
288304
var previousThrowWhenNotExists = true;
305+
var parameters = new List<object>();
289306
foreach (var parameterInfo in parameterInfos)
290307
{
291308
if (option?.FatherImplementations?.TryGetValue(parameterInfo.ParameterType, out var impl) is true)
@@ -305,7 +322,7 @@ private object ResolveTypeToObject(Type implementType, DependencyResolveOption?
305322
if (msattr is not null)
306323
{
307324
var key = msattr.GetType().GetProperty("Key")?.GetValue(msattr);
308-
option.RelationName = $"{key?.GetType()}:{key?.GetHashCode()}";
325+
option.RelationName = SafeToString(key);
309326
}
310327
}
311328
if (parameterInfo.GetCustomAttributes().FirstOrDefault(t => t is FromNamedServiceAttribute) is
@@ -337,20 +354,9 @@ private object ResolveTypeToObject(Type implementType, DependencyResolveOption?
337354
$"The constructor of {implementType.Name} contains a parameter called {parameterInfo.Name} ({parameterInfo.Position}) which cannot resolved");
338355
}
339356
}
340-
341357
if (option is not null)
342358
option.ThrowWhenNotExists = previousThrowWhenNotExists;
343-
var dependencyImpl = constructorInfo.Invoke(parameters.ToArray());
344-
if (option?.FatherImplementations is { Count: > 0 })
345-
{
346-
foreach (var kvp in option.FatherImplementations)
347-
{
348-
_fatherToChildRelation.GetOrCreateValue(kvp.Value).Add(new WeakReference(dependencyImpl));
349-
_childToFatherRelation.GetOrCreateValue(dependencyImpl).Add(new WeakReference(kvp.Value));
350-
}
351-
}
352-
353-
return dependencyImpl;
359+
return parameters;
354360
}
355361

356362

@@ -418,4 +424,23 @@ private object ResolveSingleton(Type implementType, DependencyResolveOption? opt
418424
RootScope.SetImplementation(implementType, impl, option?.RelationName);
419425
return impl;
420426
}
427+
428+
internal static string SafeToString(object? obj)
429+
{
430+
if (obj == null)
431+
return "null";
432+
433+
var type = obj.GetType();
434+
var toStringMethod = type.GetMethod("ToString", Type.EmptyTypes);
435+
436+
// 检查是否在当前类型中重写了 ToString(排除继承自 object 的)
437+
if (toStringMethod != null && toStringMethod.DeclaringType != typeof(object))
438+
{
439+
return obj.ToString();
440+
}
441+
else
442+
{
443+
return $"{type.FullName}@{obj.GetHashCode():X}";
444+
}
445+
}
421446
}

Depository.Core/Depository.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
1-
using Depository.Abstraction.Enums;
1+
using System.Runtime.CompilerServices;
2+
using Depository.Abstraction.Enums;
23
using Depository.Abstraction.Interfaces;
34
using Depository.Abstraction.Interfaces.Pipeline;
45
using Depository.Abstraction.Models;
56
using Depository.Abstraction.Models.Options;
67

8+
[assembly:InternalsVisibleTo("Depository.Extensions.DependencyInjection")]
9+
710
namespace Depository.Core;
811

912
public partial class Depository : IDepository

Depository.Extensions.DependencyInjection/DepositoryServiceProvider.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,15 @@ public object GetRequiredService(Type serviceType)
3535
return _depository.ResolveDependency(serviceType, new DependencyResolveOption()
3636
{
3737
ThrowWhenNotExists = false,
38-
RelationName = DepositoryServiceProviderFactory.SafeToString(serviceKey)
38+
RelationName = Core.Depository.SafeToString(serviceKey)
3939
});
4040
}
4141

4242
public object GetRequiredKeyedService(Type serviceType, object? serviceKey)
4343
{
4444
return _depository.ResolveDependency(serviceType, new DependencyResolveOption()
4545
{
46-
RelationName = DepositoryServiceProviderFactory.SafeToString(serviceKey)
46+
RelationName = Core.Depository.SafeToString(serviceKey)
4747
});
4848
}
4949

@@ -55,7 +55,7 @@ public bool IsService(Type serviceType)
5555
public bool IsKeyedService(Type serviceType, object? serviceKey)
5656
{
5757
var dependency = _depository.GetDependency(serviceType);
58-
return dependency is not null && _depository.GetRelations(dependency).Any(t=>t.Name == DepositoryServiceProviderFactory.SafeToString(serviceKey));
58+
return dependency is not null && _depository.GetRelations(dependency).Any(t=>t.Name == Core.Depository.SafeToString(serviceKey));
5959
}
6060

6161
public IServiceScope CreateScope()

Depository.Extensions.DependencyInjection/DepositoryServiceProviderFactory.cs

Lines changed: 1 addition & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ serviceDescriptor.KeyedImplementationInstance is null &&
5050
relation = new DependencyRelation(serviceDescriptor.KeyedImplementationType!)
5151
{
5252
DefaultImplementation = serviceDescriptor.KeyedImplementationInstance,
53-
Name = SafeToString(serviceDescriptor.ServiceKey)
53+
Name = Core.Depository.SafeToString(serviceDescriptor.ServiceKey)
5454
};
5555
if (serviceDescriptor.KeyedImplementationFactory is not null)
5656
{
@@ -99,24 +99,5 @@ private static void QuickAddSingleton<TService, TImplement>(IDepository deposito
9999
var relation = new DependencyRelation(typeof(TImplement), sp);
100100
depository.AddRelation(dependency, relation);
101101
}
102-
103-
public static string SafeToString(object? obj)
104-
{
105-
if (obj == null)
106-
return "null";
107-
108-
var type = obj.GetType();
109-
var toStringMethod = type.GetMethod("ToString", Type.EmptyTypes);
110-
111-
// 检查是否在当前类型中重写了 ToString(排除继承自 object 的)
112-
if (toStringMethod != null && toStringMethod.DeclaringType != typeof(object))
113-
{
114-
return obj.ToString();
115-
}
116-
else
117-
{
118-
return $"{type.FullName}@{obj.GetHashCode():X}";
119-
}
120-
}
121102
}
122103
}

0 commit comments

Comments
 (0)