Заменить Dictionary<Enum, ISomeClass> на IoC контейнер с DI

197
30 сентября 2018, 03:50

Есть следующий код, который хранит в себе экземпляры, реализующих 1 интерфейс, классов и по запросу выдаёт нужный, в зависимости от ключа ( он тут типа string, но я заменил на enum ). Это нужно мне для того, что бы было удобно хранить и получать доступ к единым экземплярам классов для разных частей программы ( синглтон ). Возможно ли такой код заменить с использованием IoC контейнера с DI

public interface ISameClass
{
    int Value { get; set; }
    void DoStuff();
}
public class SameClass : ISameClass
{
    int Value { get; set; }
    void DoStuff()
    {
    //Do something
    }
}
public class SameClassProvider
{
        private readonly Dictionary<string, ISameClass> _sameClasses;
        public SameClassProvider(string parentDir)
        {
            _sameClasses = new Dictionary<string, ISameClass>
            {
                { "Type1", new SameClass() },
                { "Type2", new SameClass() },
                { "Type3", new SameClass() }
            };
        }
        public bool AddClass(string type, ISameClass class)
        {
            if (_sameClasses.ContainsKey(type) || class == null)
            {
                return false;
            }
            _nodes.Add(type, class);
            return true;
        }
        public ISameClass GetClass(string type)
        {
            if (_sameClasses.TryGetValue(type, out var someClass))
            {
                return someClass;
            }
        }
}
Answer 1

Конечно можно. Например, у нас есть интерфейс и классы

public interface II
{
    void SayHello();
}
public class AClass: II
{
    public void SayHello() => Console.WriteLine(nameof(AClass));
}
public class BClass : II
{
    public void SayHello() => Console.WriteLine(nameof(BClass));
}

В примерах я покажу, как делать это с Unity контейнером. Если вы хотите зарегистрировать инстансы, вы можете дать им имена

var container = new UnityContainer();
container.RegisterInstance<II>("AClass", new AClass());
container.RegisterInstance<II>("BClass", new BClass());
container.Resolve<II>("AClass").SayHello();
container.Resolve<II>("BClass").SayHello();

Вывод

AClass
BClass

вы также можете поступить, если надо зарегистрировать тип

var container = new UnityContainer();
container.RegisterType<II,AClass >("AClass");
container.RegisterType<II,BClass >("BClass");
container.Resolve<II>("AClass").SayHello();
container.Resolve<II>("BClass").SayHello();

Вывод аналогичен

AClass
BClass
READ ALSO
Xamarin Android Native Binding Listeners ошибки

Xamarin Android Native Binding Listeners ошибки

Я пытаюсь заимплементить последнюю версию YandexMapkit в мой Xamarin

205
Кастомный StackPanel неверно отображается

Кастомный StackPanel неверно отображается

Делаю свой StackPanel с кнопкой для скрытия

227
Как можно связать экземпляры класса и значения ListBox

Как можно связать экземпляры класса и значения ListBox

Есть ListBox,в который элементы добавляются с помощью цикла,каждый элемент ListBox - свойства экземпляра класса в строчном представлении(экземпляров...

231
Как заменить кириллицу на латиницу и наоборот. Без ошибок при возврате на кириллицу

Как заменить кириллицу на латиницу и наоборот. Без ошибок при возврате на кириллицу

Кодирую сообщения в base64, но кодировать кириллицу затратно по памяти, а вот латиница кодируется чуть ли не в два раза меньшеЗадается вопрос,...

212