其他分享
首页 > 其他分享> > 依赖注入

依赖注入

作者:互联网

Masa的依赖注入系统是基于Microsoft的依赖注入扩展库(Microsoft.Extensions.DependencyInjection nuget包)开发的,因此,它的文档在Masa中也是有效的。

按照约定的注册

Masa引入了按照约定进行服务注册,依据约定大于配置,开发者无需做任何事,框架会自动完成注册

依赖接口

示例:

``` C#
public class StorageOptions : ITransientDependency
{
  
}
```

特性

IgnoreInjection

忽略注入,用于排除不被自动注入

示例:

``` C#
public class BaseService : ISingletonDependency
{
    public static int Count { get; set; } = 0;

    public BaseService()
    {
        Count++;
    }

    public BaseService(bool isChildren)
    {

    }
}

[IgnoreInjection]
public class GoodsBaseService : BaseService
{
    public GoodsBaseService() : base(true)
    {
    }
}

public class GoodsService : GoodsBaseService
{
    public static int GoodsCount { get; set; } = 0;

    public GoodsService()
    {
        GoodsCount++;
    }
}
```

效果等同于:services.AddSingleton<BaseService>(); services.AddSingleton<GoodsService>();

Dependency

配合ISingletonDependency、IScopedDependency、ITransientDependency使用,实现服务仅被注册一次

示例:

``` C#
public interface ICache : ISingletonDependency
{
    void Set(string key, string value);
}

[Dependency(TryRegister = true)]
public class EmptyCache : ICache
{
    public void Set(string key, string value)
    {
        throw new NotSupportedException($"暂不支持{nameof(Set)}方法");
    }
}

public class MemoryCache : ICache
{
    private readonly ConcurrentDictionary<string, Lazy<string>> _dicCache = new();

    public void Set(string key, string value)
    {
        _ = _dicCache.AddOrUpdate
        (
            key,
            k => new Lazy<string>(() => value, LazyThreadSafetyMode.ExecutionAndPublication),
            (_, _) => new Lazy<string>(() => value, LazyThreadSafetyMode.ExecutionAndPublication)
        ).Value;
    }
}
```

效果等同于:services.AddSingleton<ICache, MemoryCache>();

示例:

``` C#
public interface IEncryptionService : ISingletonDependency
{
    string MethodName { get; }
}

[Dependency(ReplaceServices = true)]
public class Sha1EncryptionService : IEncryptionService
{
    public string MethodName => "Sha1";
}

public class Md5EncryptionService : IEncryptionService
{
    public string MethodName => "Md5";
}
```

效果等同于:services.AddSingleton<IEncryptionService, Sha1EncryptionService>();

快速入门

  1. 新建单元测试项目Assignment.DependencyInjection,选择MSTest,并安装Masa.Utils.Extensions.DependencyInjection

    dotnet new xunit -o Assignment.DependencyInjection
    cd Assignment.DependencyInjection
    dotnet add package Masa.Utils.Extensions.DependencyInjection --version 0.5.0-preview.2
    
  2. 新建类StorageOptions

    public class StorageOptions : ITransientDependency
    {
      
    }
    
  3. 新建类DITest

    [TestClass]
    public class DITest
    {
        private IServiceCollection _services;
    
        [TestInitialize]
        public void Init()
        {
            _services = new ServiceCollection();
            _services.AddAutoInject();//执行自动注入
        }
    
        [TestMethod]
        public void TestAutoInject()
        {
            Assert.IsTrue(_services.Any<StorageOptions>(ServiceLifetime.Transient));//判断StorageOptions注册成功,且生命周期为Transient
        }
    
        private IServiceProvider ServiceProvider => _services.BuildServiceProvider();
    }
    

总结

如果需要使用按照约定自动注册服务,则请记住

本章源码

Assignment07

https://github.com/zhenlei520/MasaFramework.Practice

开源地址

MASA.BuildingBlocks:https://github.com/masastack/MASA.BuildingBlocks

MASA.Contrib:https://github.com/masastack/MASA.Contrib

MASA.Utils:https://github.com/masastack/MASA.Utils

MASA.EShop:https://github.com/masalabs/MASA.EShop

MASA.Blazor:https://github.com/BlazorComponent/MASA.Blazor

如果你对我们的 MASA Framework 感兴趣,无论是代码贡献、使用、提 Issue,欢迎联系我们

16373211753064.png

标签:依赖,string,MASA,public,注册,services,class,注入
来源: https://www.cnblogs.com/zhenlei520/p/16497621.html