3 Star 13 Fork 4

faib920 / fireasy3

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
DependencyInjectionTests.cs 16.17 KB
一键复制 编辑 原始数据 按行查看 历史
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555
using Fireasy.Common.DependencyInjection;
using Fireasy.Common.DependencyInjection.Filters;
using Fireasy.Common.DynamicProxy;
using Microsoft.Extensions.DependencyInjection;
using System.Reflection;
namespace Fireasy.Common.Tests
{
/// <summary>
/// 依赖注入测试
/// </summary>
[TestClass]
public class DependencyInjectionTests
{
/// <summary>
/// 添加 fireasy 支持
/// </summary>
[TestMethod]
public void TestAddFireasy()
{
var services = new ServiceCollection();
var builder = services.AddFireasy();
var serviceProvider = services.BuildServiceProvider();
Assert.IsNotNull(serviceProvider);
}
/// <summary>
/// 列出被发现的程序集列表
/// </summary>
[TestMethod]
public void TestDisplayAssemblies()
{
var services = new ServiceCollection();
var builder = services.AddFireasy();
var serviceProvider = services.BuildServiceProvider();
var discoverer = serviceProvider.GetRequiredService<IServiceDiscoverer>();
foreach (var assembly in discoverer.Assemblies)
{
Console.WriteLine(assembly.FullName);
}
}
/// <summary>
/// 使用自定义的 <see cref="IServiceDiscoverer"/>
/// </summary>
[TestMethod]
public void TestUseMyDiscoverer()
{
var services = new ServiceCollection();
var builder = services.AddFireasy(opt => opt.DiscoverOptions.DiscovererFactory = (services, options) => new MyServiceDiscoverer(services, options));
var serviceProvider = services.BuildServiceProvider();
var discoverer = serviceProvider.GetRequiredService<IServiceDiscoverer>();
Assert.AreEqual(discoverer.GetType(), typeof(MyServiceDiscoverer));
foreach (var assembly in discoverer.Assemblies)
{
Console.WriteLine(assembly.FullName);
}
}
/// <summary>
/// 自定义服务发现类
/// </summary>
private class MyServiceDiscoverer : DefaultServiceDiscoverer
{
public MyServiceDiscoverer(IServiceCollection services, DiscoverOptions options)
: base(services, options)
{
}
/// <summary>
/// 只返回当前程序集
/// </summary>
/// <returns></returns>
protected override IEnumerable<Assembly> GetAssemblies()
{
yield return this.GetType().Assembly;
}
}
/// <summary>
/// 使用过滤器,列出被发现的程序集列表
/// </summary>
[TestMethod]
public void TestUseAssemblyFilter()
{
var services = new ServiceCollection();
var builder = services.AddFireasy(opt => opt.DiscoverOptions.AssemblyFilters.Add(new MyAssemblyFilter()));
var serviceProvider = services.BuildServiceProvider();
var discoverer = serviceProvider.GetRequiredService<IServiceDiscoverer>();
foreach (var assembly in discoverer.Assemblies)
{
Console.WriteLine(assembly.FullName);
}
}
private class MyAssemblyFilter : IAssemblyFilter
{
public bool IsFilter(Assembly assembly)
{
return !assembly.FullName!.StartsWith("Fireasy.Common.Tests");
}
}
/// <summary>
/// 使用过滤器,列出被发现的程序集列表
/// </summary>
[TestMethod]
public void TestUseAssemblyFilterPredicate()
{
var services = new ServiceCollection();
var builder = services.AddFireasy(opt => opt.DiscoverOptions.AssemblyFilterPredicates.Add(s => !s.FullName!.StartsWith("Fireasy.Common.Tests")));
var serviceProvider = services.BuildServiceProvider();
var discoverer = serviceProvider.GetRequiredService<IServiceDiscoverer>();
foreach (var assembly in discoverer.Assemblies)
{
Console.WriteLine(assembly.FullName);
}
}
/// <summary>
/// 列出被发现的服务列表
/// </summary>
[TestMethod]
public void TestDisplayDescriptors()
{
var services = new ServiceCollection();
var builder = services.AddFireasy();
var serviceProvider = services.BuildServiceProvider();
var discoverer = serviceProvider.GetRequiredService<IServiceDiscoverer>();
foreach (var desc in discoverer.Descriptors)
{
Console.WriteLine($"{desc.ServiceType} -> {desc.ImplementationType}");
}
}
/// <summary>
/// 测试单例服务
/// </summary>
[TestMethod]
public void TestSingletonService()
{
var services = new ServiceCollection();
var builder = services.AddFireasy();
var serviceProvider = services.BuildServiceProvider();
var service1 = serviceProvider.GetService<ITestSingletonService>();
var service2 = serviceProvider.GetService<ITestSingletonService>();
Assert.IsNotNull(service1);
Assert.IsNotNull(service2);
//两对象的id应相等
Assert.AreEqual(service1.Id, service2.Id);
}
/// <summary>
/// 测试瞬时服务
/// </summary>
[TestMethod]
public void TestTransientService()
{
var services = new ServiceCollection();
var builder = services.AddFireasy();
var serviceProvider = services.BuildServiceProvider();
var service1 = serviceProvider.GetService<ITestTransientService>();
var service2 = serviceProvider.GetService<ITestTransientService>();
Assert.IsNotNull(service1);
Assert.IsNotNull(service2);
//两对象的id应不相等
Assert.AreNotEqual(service1.Id, service2.Id);
}
/// <summary>
/// 测试作用域服务
/// </summary>
[TestMethod]
public void TestScopedService()
{
var services = new ServiceCollection();
var builder = services.AddFireasy();
var serviceProvider = services.BuildServiceProvider();
Guid id1, id2;
//作用域1
using (var scope1 = serviceProvider.CreateScope())
{
var service1 = scope1.ServiceProvider.GetService<ITestScopedService>();
var service2 = scope1.ServiceProvider.GetService<ITestScopedService>();
Assert.IsNotNull(service1);
Assert.IsNotNull(service2);
//两对象的id应相等
Assert.AreEqual(service1.Id, service2.Id);
id1 = service1.Id;
}
//作用域2
using (var scope2 = serviceProvider.CreateScope())
{
var service1 = scope2.ServiceProvider.GetService<ITestScopedService>();
var service2 = scope2.ServiceProvider.GetService<ITestScopedService>();
Assert.IsNotNull(service1);
Assert.IsNotNull(service2);
//两对象的id应相等
Assert.AreEqual(service1.Id, service2.Id);
id2 = service1.Id;
}
//两次scoped的id应不相等
Assert.AreNotEqual(id1, id2);
}
/// <summary>
/// 测试通过 <see cref="ServiceRegisterAttribute"/> 注册的服务
/// </summary>
[TestMethod]
public void TestWithRegisterAttributeService()
{
var services = new ServiceCollection();
var builder = services.AddFireasy();
var serviceProvider = services.BuildServiceProvider();
var service1 = serviceProvider.GetService<ITestWithRegisterAttr>();
var service2 = serviceProvider.GetService<ITestWithRegisterAttr>();
var service3 = serviceProvider.GetService<TestWithRegisterAttrNonIntefaceImpl>();
Assert.IsNotNull(service1);
Assert.IsNotNull(service2);
Assert.IsNotNull(service3);
//两对象的id应不相等
Assert.AreNotEqual(service1.Id, service2.Id);
}
/// <summary>
/// 测试使用 <see cref="DisableServerDiscoverAttribute"/> 忽略发现
/// </summary>
[TestMethod]
public void TestDisableDiscover()
{
var services = new ServiceCollection();
var builder = services.AddFireasy();
var serviceProvider = services.BuildServiceProvider();
var service = serviceProvider.GetService<ITestDisableDiscover>();
Assert.IsNull(service);
}
/// <summary>
/// 测试对象访问器
/// </summary>
[TestMethod]
public void TestObjectAccessor()
{
var services = new ServiceCollection();
services.AddObjectAccessor<ITestSingletonService>(new TestSingletonServiceImpl());
//services.AddObjectAccessor<ITestSingletonService>(new TestSingletonServiceImpl()); //测试抛错
var serviceProvider = services.BuildServiceProvider();
var obj = serviceProvider.GetService<IObjectAccessor<ITestSingletonService>>();
Assert.IsNotNull(obj);
using (var scope = serviceProvider.CreateScope())
{
var obj1 = scope.ServiceProvider.GetService<IObjectAccessor<ITestSingletonService>>();
Assert.IsNotNull(obj1);
Assert.AreEqual(obj, obj1);
}
}
/// <summary>
/// 测试从 <see cref="IServiceCollection"/> 里获取实例
/// </summary>
[TestMethod]
public void TestGetInstance()
{
var services = new ServiceCollection();
services.AddSingleton<ITestSingletonService>(new TestSingletonServiceImpl());
var obj1 = services.GetSingletonInstance<ITestSingletonService>();
var obj2 = services.GetSingletonInstance<ITestSingletonService>();
Assert.IsNotNull(obj1);
Assert.AreEqual(obj1, obj2);
}
/// <summary>
/// 测试从 <see cref="IServiceCollection"/> 里获取实例(工厂模式)
/// </summary>
[TestMethod]
public void TestGetInstanceFactory()
{
var services = new ServiceCollection();
services.AddSingleton<ITestSingletonService>(sp => new TestSingletonServiceImpl());
var obj1 = services.GetSingletonInstance<ITestSingletonService>();
var obj2 = services.GetSingletonInstance<ITestSingletonService>();
Assert.IsNotNull(obj1);
Assert.AreNotEqual(obj1, obj2);
}
/// <summary>
/// 测试从 <see cref="IServiceCollection"/> 里获取实例(工厂模式,但IServiceProvider为空)
/// </summary>
[TestMethod]
public void TestGetInstanceFactoryButServiceProviderIsNull()
{
var services = new ServiceCollection();
services.AddSingleton<ITestSingletonService>(sp => new TestSingletonServiceImplWithArgs(sp));
Assert.ThrowsException<ArgumentNullException>(() => services.GetSingletonInstance<ITestSingletonService>());
}
/// <summary>
/// 测试动态代理类
/// </summary>
[TestMethod]
public void TestDynamicProxy()
{
var services = new ServiceCollection();
var builder = services.AddFireasy();
var serviceProvider = builder.Services.BuildServiceProvider();
var obj = serviceProvider.GetService<TestDynamicProxyClass>();
Assert.AreNotEqual(typeof(TestDynamicProxyClass), obj.GetType());
var value = obj.GetString();
Assert.AreEqual("hello world", value);
}
/// <summary>
/// 测试泛型类
/// </summary>
[TestMethod]
public void TestGenericType()
{
var services = new ServiceCollection();
var builder = services.AddFireasy();
var serviceProvider = builder.Services.BuildServiceProvider();
var obj = serviceProvider.GetService<IGenericService<string, int>>();
var value = obj.GetValue();
Assert.AreEqual(null, value);
}
#region 测试接口和类
public interface ITestSingletonService
{
Guid Id { get; }
void Test();
}
public class TestSingletonServiceImpl : ITestSingletonService, ISingletonService
{
public TestSingletonServiceImpl()
{
Id = Guid.NewGuid();
}
public Guid Id { get; }
public void Test() => Console.WriteLine("Hello TestSingletonService!");
}
public class TestSingletonServiceImplWithArgs : ITestSingletonService
{
public TestSingletonServiceImplWithArgs(IServiceProvider serviceProvider)
{
Guard.ArgumentNull(serviceProvider, nameof(serviceProvider));
Id = Guid.NewGuid();
}
public Guid Id { get; }
public void Test() => Console.WriteLine("Hello TestSingletonService!");
}
public interface ITestTransientService
{
Guid Id { get; }
void Test();
}
public class TestTransientServiceImpl : ITestTransientService, ITransientService
{
public TestTransientServiceImpl()
{
Id = Guid.NewGuid();
}
public Guid Id { get; }
public void Test() => Console.WriteLine("Hello TestTransientService!");
}
public interface ITestScopedService
{
Guid Id { get; }
void Test();
}
public class TestScopedServiceImpl : ITestScopedService, IScopedService
{
public TestScopedServiceImpl()
{
Id = Guid.NewGuid();
}
public Guid Id { get; }
public void Test() => Console.WriteLine("Hello TestScopedService!");
}
public interface ITestWithRegisterAttr
{
Guid Id { get; }
void Test();
}
[ServiceRegister(ServiceLifetime.Transient)]
public class TestWithRegisterAttrImpl : ITestWithRegisterAttr
{
public TestWithRegisterAttrImpl()
{
Id = Guid.NewGuid();
}
public Guid Id { get; }
public void Test() => Console.WriteLine("Hello TestWithRegisterAttribute!");
}
[ServiceRegister(ServiceLifetime.Transient)]
public class TestWithRegisterAttrNonIntefaceImpl
{
public void Test() => Console.WriteLine("Hello TestWithRegisterAttribute!");
}
public interface ITestWithRegisterOneselfAttr
{
Guid Id { get; }
void Test();
}
public interface ITestDisableDiscover
{
void Test();
}
[DisableServerDiscover]
public class TestDisableDiscoverImpl : ITestDisableDiscover
{
public void Test() => Console.WriteLine("Hello TestWithRegisterAttribute!");
}
public interface IGenericService<T1, T2>
{
T1 GetValue();
}
public class GenericService<T1, T2> : IGenericService<T1, T2>, ITransientService
{
public T1 GetValue()
{
return default;
}
}
public class TestDynamicProxyClass : ITransientService
{
[Intercept(typeof(AnyInterceptor))]
public virtual string GetString()
{
return string.Empty;
}
}
public class AnyInterceptor : IInterceptor
{
public void Initialize(InterceptContext context)
{
}
public void Intercept(InterceptCallInfo info)
{
info.ReturnValue = "hello world";
Console.WriteLine(info.InterceptType);
}
}
#endregion
}
}
1
https://gitee.com/faib920/fireasy3.git
git@gitee.com:faib920/fireasy3.git
faib920
fireasy3
fireasy3
dev3.0

搜索帮助

53164aa7 5694891 3bd8fe86 5694891