Search code examples
.netunity-containercode-injectionabstract

How to replace unity Injection on runtime


I have one abstract Class and tow implementation for it.

public abstract class Person{
    public abstract string GetName();
} 

public class Doctor : Person{
    public override string GetName()
    {
        return "Doctor";
    }
}

public class Teacher : Person{
    public override string GetName()
    {
        return "teacher";
    }
}

I am using unity to dependency injection.In unity I register Doctor and in run time I need to use teacher ,actually replace that injection in my test2 method : here is my unity injection :

container.RegisterType<Person, Doctor>();

here is my class constructor :

private readonly Iperson _person;
pubice myclass(Iperson person)
{
    _person=person
}

public voide test1()
{
    var Name=_person.GetName();
    // Name is : Doctor
}

public void test2()
{
    //????
    var Name=_person.GetName();
    // Name must be teacher 
}

Solution

  • I suggest you to register both of your derived classes: Doctor and Teacher

    container.RegisterType<Person, Doctor>(nameof(Doctor));
    container.RegisterType<Person, Teacher>(nameof(Teacher));
    

    Pass IUnityContainer to MyClass and resolve in runtime what you want by name:

    private readonly IUnityContainer _container;
    
    public MyClass(IUnityContainer container)
    {
        _container = container
    }
    
    public void test1()
    {
        var name = container.Resolve<Person>(nameof(Doctor)).GetName();
        // Name is : Doctor
    }
    
    public void test2()
    {
        var name = container.Resolve<Person>(nameof(Teacher)).GetName();
        // Name is : Teacher
    }