mirror of https://github.com/abpframework/abp
parent
82df88ed0c
commit
7062059d44
@ -0,0 +1,44 @@
|
||||
using System;
|
||||
using Autofac;
|
||||
using Autofac.Extensions.DependencyInjection;
|
||||
using Volo.Abp.DependencyInjection;
|
||||
|
||||
namespace Volo.Abp.Autofac;
|
||||
|
||||
public class AutoFacInjectPropertiesService : IInjectPropertiesService, ITransientDependency
|
||||
{
|
||||
protected IServiceProvider ServiceProvider { get; }
|
||||
|
||||
public AutoFacInjectPropertiesService(IServiceProvider serviceProvider)
|
||||
{
|
||||
ServiceProvider = serviceProvider;
|
||||
}
|
||||
|
||||
public virtual TService InjectProperties<TService>(TService instance) where TService : notnull
|
||||
{
|
||||
return InjectProperties(instance, false);
|
||||
}
|
||||
|
||||
public virtual TService InjectUnsetProperties<TService>(TService instance) where TService : notnull
|
||||
{
|
||||
return InjectProperties(instance, true);
|
||||
}
|
||||
|
||||
protected virtual TService InjectProperties<TService>(TService instance, bool onlyForUnsetProperties)
|
||||
where TService : notnull
|
||||
{
|
||||
if (instance == null)
|
||||
{
|
||||
throw new ArgumentNullException(nameof(instance));
|
||||
}
|
||||
|
||||
if (ServiceProvider is not AutofacServiceProvider)
|
||||
{
|
||||
throw new AbpException($"The {nameof(ServiceProvider)} must be an instance of {nameof(AutofacServiceProvider)}!");
|
||||
}
|
||||
|
||||
return onlyForUnsetProperties
|
||||
? ServiceProvider.As<AutofacServiceProvider>().LifetimeScope.InjectUnsetProperties(instance)
|
||||
: ServiceProvider.As<AutofacServiceProvider>().LifetimeScope.InjectProperties(instance);
|
||||
}
|
||||
}
|
@ -0,0 +1,16 @@
|
||||
using System;
|
||||
|
||||
namespace Volo.Abp.DependencyInjection;
|
||||
|
||||
public interface IInjectPropertiesService
|
||||
{
|
||||
/// <summary>
|
||||
/// Set any properties on <paramref name="instance"/> that can be resolved by IServiceProvider.
|
||||
/// </summary>
|
||||
TService InjectProperties<TService>(TService instance) where TService : notnull;
|
||||
|
||||
/// <summary>
|
||||
/// Set any null-valued properties on <paramref name="instance"/> that can be resolved by the IServiceProvider.
|
||||
/// </summary>
|
||||
TService InjectUnsetProperties<TService>(TService instance) where TService : notnull;
|
||||
}
|
@ -0,0 +1,17 @@
|
||||
namespace Volo.Abp.DependencyInjection;
|
||||
|
||||
[Dependency(TryRegister = true)]
|
||||
public class NullInjectPropertiesService : IInjectPropertiesService, ITransientDependency
|
||||
{
|
||||
public TService InjectProperties<TService>(TService instance)
|
||||
where TService : notnull
|
||||
{
|
||||
return instance;
|
||||
}
|
||||
|
||||
public TService InjectUnsetProperties<TService>(TService instance)
|
||||
where TService : notnull
|
||||
{
|
||||
return instance;
|
||||
}
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
using Microsoft.Extensions.DependencyInjection;
|
||||
using Shouldly;
|
||||
using Volo.Abp.Autofac.Interception;
|
||||
using Volo.Abp.DependencyInjection;
|
||||
using Xunit;
|
||||
|
||||
namespace Volo.Abp.Autofac;
|
||||
|
||||
public class AutoFacInjectingPropertiesService_Tests : Autofac_Interception_Test
|
||||
{
|
||||
[Fact]
|
||||
public void AutoFacInjectingPropertiesService_Should_Replaces_NullInjectingPropertiesService()
|
||||
{
|
||||
ServiceProvider.GetRequiredService<IInjectPropertiesService>().GetType().ShouldBe(typeof(AutoFacInjectPropertiesService));
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void InjectProperties()
|
||||
{
|
||||
var injectPropertiesService = ServiceProvider.GetRequiredService<IInjectPropertiesService>();
|
||||
var serviceB = new TestServiceB();
|
||||
injectPropertiesService.InjectProperties(serviceB);
|
||||
|
||||
serviceB.NullTestServiceA.ShouldNotBeNull();
|
||||
serviceB.NullTestServiceA.Name.ShouldBe("Default Name");
|
||||
serviceB.NotNullTestServiceA.ShouldNotBeNull();
|
||||
serviceB.NotNullTestServiceA.Name.ShouldBe("Default Name");
|
||||
}
|
||||
|
||||
[Fact]
|
||||
public void InjectUnsetProperties()
|
||||
{
|
||||
var injectPropertiesService = ServiceProvider.GetRequiredService<IInjectPropertiesService>();
|
||||
var serviceB = new TestServiceB();
|
||||
injectPropertiesService.InjectUnsetProperties(serviceB);
|
||||
|
||||
serviceB.NullTestServiceA.ShouldNotBeNull();
|
||||
serviceB.NullTestServiceA.Name.ShouldBe("Default Name");
|
||||
serviceB.NotNullTestServiceA.ShouldNotBeNull();
|
||||
serviceB.NotNullTestServiceA.Name.ShouldBe("My Name"); // This is not null property.
|
||||
}
|
||||
}
|
||||
|
||||
interface ITestServiceA
|
||||
{
|
||||
public string Name { get; set; }
|
||||
}
|
||||
|
||||
class TestServiceA : ITestServiceA, ITransientDependency
|
||||
{
|
||||
public string Name { get; set; } = "Default Name";
|
||||
}
|
||||
|
||||
interface ITestServiceB
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
class TestServiceB : ITestServiceB, ITransientDependency
|
||||
{
|
||||
public ITestServiceA NullTestServiceA { get; set; }
|
||||
|
||||
public ITestServiceA NotNullTestServiceA { get; set; } = new TestServiceA()
|
||||
{
|
||||
Name = "My Name"
|
||||
};
|
||||
}
|
Loading…
Reference in new issue