Есть следующий код, который хранит в себе экземпляры, реализующих 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;
}
}
}
Конечно можно. Например, у нас есть интерфейс и классы
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
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Я пытаюсь заимплементить последнюю версию YandexMapkit в мой Xamarin
Есть ListBox,в который элементы добавляются с помощью цикла,каждый элемент ListBox - свойства экземпляра класса в строчном представлении(экземпляров...
Кодирую сообщения в base64, но кодировать кириллицу затратно по памяти, а вот латиница кодируется чуть ли не в два раза меньшеЗадается вопрос,...