See: IUnreferenceable

interface Worker
{
    public void Do(LogLevel level, string message);
}

class Worker1: Worker
{

    protected string defaultName;

    public Worker1(string name = null)
    {
        this.defaultName = name ?? "Default name1";
    }

    public void Do(LogLevel level, string message)
    {
        Console.WriteLine($"Write to {defaultName}.{level} message: {message}");
    }
}

class Worker2: Worker
{
    protected string defaultName;

    public Worker2(string name = null)
    {
        this.defaultName = name ?? "Default name2";
    }

    public void Do(LogLevel level, string message)
    {
        Console.WriteLine($"Write to {defaultName}.{level} message: {message}");
    }
}



class SimpleController : IReferenceable, IUnreferenceable
{
    protected Worker worker;

    public void SetReferences(IReferences references)
    {
        worker = references.GetOneRequired<Worker>(111);
    }

    public void UnsetReferences()
    {
        worker = null;
    }

    public void Greeting(string name)
    {
        worker.Do(LogLevel.Info, "Hello, " + (name) + "!");
    }
}