.NET 4.x Если я не знаю, экземпляр какого класса создавать до компиляции, как быть? - C#
Формулировка задачи:
Доброго времени суток.
Помогите, пожалуйста, решить проблему:
Есть интерфейс, от которого наследуются два класса.
В интерфейсе определены методы для работы с информацией.
А каждый из двух классов реализует эти методы с сохранением данных в БД, и в XML соответственно.
Во время выполнения программы пользователь сам выбирает место хранения информации.
Следовательно экземпляр какого-то из этих двух классов должен создаваться во время выполнения приложения.
Поясните, пожалуйста, как это реализовать.
Вроде бы для этого существует dependency injection, но аналогичных примеров в сети нет.
Если бы кто-то из форумчан, объяснил, как это можно сделать с помощью внедрения зависимостей, было бы здорово.
Не обязательно именно в данном контексте.
Просто хотелось бы посмотреть на пример, где во время выполнения программы решается экземпляр какого класса создавать с помощью dependency injection.
Заранее спасибо
Решение задачи: «.NET 4.x Если я не знаю, экземпляр какого класса создавать до компиляции, как быть?»
textual
Листинг программы
public class Program
{
private static void Main()
{
bool xml = true;
string type1 = xml ? "XML" : "DB";
IRepository<int> repository1 = Factory.GetRepository<int>(type1);
xml = false;
string type2 = xml ? "XML" : "DB";
IRepository<double> repository2 = Factory.GetRepository<double>(type2);
}
static class Factory
{
public static IRepository<T> GetRepository<T>(String type)
{
switch (type)
{
case "XML":
return new XmlRepository<T>();
case "DB":
return new DBRepository<T>();
default:
throw new ArgumentException();
}
}
}
interface IRepository<T>
{
T Create(T entity);
void Update(T entity);
void Delete(T entity);
}
private class XmlRepository<T> : IRepository<T>
{
public XmlRepository()
{
Console.WriteLine("XmlRepository created with Type {0}", typeof(T).Name);
}
public T Create(T entity)
{
throw new NotImplementedException();
}
public void Update(T entity)
{
throw new NotImplementedException();
}
public void Delete(T entity)
{
throw new NotImplementedException();
}
}
private class DBRepository<T> : IRepository<T>
{
public DBRepository()
{
Console.WriteLine("DataBaseRepository created with Type {0}", typeof (T).Name);
}
public T Create(T entity)
{
throw new NotImplementedException();
}
public void Update(T entity)
{
throw new NotImplementedException();
}
public void Delete(T entity)
{
throw new NotImplementedException();
}
}
}