K.Z
K.Z

Reputation: 5075

How to implement Dependencies Injection in abstract class

I have an abstract class Validation, which got further extending TextLetterValidation and TextNullValidation. My question is, how to use and implement dependency injection?

interface

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

Abstract class

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

text Letter validation

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

Text null validation

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

my question is how to implement above in my class?

My 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;
    }

Upvotes: 1

Views: 106

Answers (1)

Greg
Greg

Reputation: 346

that depends what you try to achiev

if you need to provide specific implementation of IValidation then register it like this:

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();
    }
});

and use factory where you inject interface

private readonly IValidation _validation;

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

or register both:

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

and change code so you have access to each implementation

private readonly ICollection<IValidation> _validation;

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

Upvotes: 5

Related Questions