c# - 如何在抽象类中实现依赖注入(inject)

标签 c# .net-core

我有一个抽象类 Validation,它进一步扩展了 TextLetterValidationTextNullValidation。我的问题是,如何使用和实现依赖注入(inject)?

界面

 public interface IValidation
{
    bool Validate(string text);
}

抽象类

 public abstract class Validation : IValidation
{
    public abstract bool Validate(string text);
}

文本字母验证

 public class TextLetterValidation : Validation
{
    public override bool Validate(string text)
    {
        return Regex.IsMatch(text, @"^[a-zA-Z]+$");
    }
}

文本空值验证

 public class TextNullValidation: Validation
{
    public override bool Validate(string text)
    {
        if (!string.IsNullOrWhiteSpace(text))
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

我的问题是如何在我的类(class)中实现上面的内容?

我的类(class)

public class xyz: AppAmbientState, IPalindrome
{
    private readonly IValidation _validation;

    public xyz(IValidation validation)
    {
        _validation = validation;
    }

    bool IPalindrome.IsTextValid { get; set; }

    public bool IsTextPalindrome(string text)
    {
        throw new NotImplementedException();
    }

    public bool ValidateText(string text)
    {

        return false;
    }

最佳答案

这取决于你想达到什么目的

如果你需要提供IValidation的具体实现,那么像这样注册它:

services.AddTransient<TextNullValidation>();
services.AddTransient<TextLetterValidation>();
services.AddTransient<Func<string, IValidation>>(sp => key =>
{
    switch (key)
    {
        case "TextNullValidation":
            return sp.GetService<TextNullValidation>();
        case "TextLetterValidation":
            return sp.GetService<TextLetterValidation>();
        default:
            throw new KeyNotFoundException();
    }
});

并在你注入(inject)接口(interface)的地方使用工厂

private readonly IValidation _validation;

public Test(Func<string, IValidation> validationFactory)
{
    // will provide TextNullValidation instance
    _validation = validationFactory("TextNullValidation"); 
}

或者同时注册:

services.AddTransient<IValidation, TextNullValidation>();
services.AddTransient<IValidation, TextLetterValidation>();

并更改代码以便您可以访问每个实现

private readonly ICollection<IValidation> _validation;

public xyz(ICollection<IValidation> validation)
{
    _validation = validation;
}

关于c# - 如何在抽象类中实现依赖注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55680451/

相关文章:

c# - Office 365 Api c# Windows 服务

C#无法在单击按钮时隐藏标签

c# - MVC 3 逆向工程数据库然后切换到代码优先

node.js - 并行或同时构建 dotnet 核心

.net - 在Dockerfile复制命令上找不到项目文件

c# - 身份框架GenerateUserToken验证问题

c# - 获取 DataTable 列数据类型

c# - 当有两个 watch 实例时,StopWatch 返回 0ms

c# - DI 容器如何知道构造函数需要什么(ASP.NET Core)?

c# - 如何在 EF Core Like 函数中使用通配符