Я провел некоторое время, документируя себя на инъекцию зависимости и МОК, но я не нашел решение моей проблемы. Почти в каждом примерах, с которыми я сталкивался, конструкторы бетонных классов не имеют никаких аргументов. Это делает все довольно «простым». Следовательно, мой вопрос здесь. < /P>
Давайте возьмем пример: мне нужно загрузить некоторые данные из двух источников A и B. Источник A содержит данные в различном формате; Например, CSV и XML. Нам не нужно указывать такую вещь для источника B. < /p>
Вот какой -то код (обратите внимание, я упростил код как можно больше, чтобы проиллюстрировать свою точку зрения): < /p>
using System.Net;
using System.IO;
using System.Reflection;
namespace Question
{
class Program
{
static void Main(string[] args)
{
//exemple of code using Client A
DependencyContainer container1 = GetContainer1();
IClient client1 = container1.Resolve("xml");
User user1 = new User(client1);
user1.run();
DependencyContainer container2 = GetContainer2();
IClient client2 = container2.Resolve();
User user2 = new User(client2);
user2.run();
}
public static DependencyContainer GetContainer1()
{
DependencyContainer container = new DependencyContainer();
container.Register();
return container;
}
public static DependencyContainer GetContainer2()
{
DependencyContainer container = new DependencyContainer();
container.Register();
return container;
}
}
public class User
{
private readonly IClient _Client;
public User(IClient client)
{
_Client = client;
}
public void run()
{
string address = _Client.getAddress();
string data = _Client.getData(address);
_Client.writeData(data);
}
}
// Abstraction
public interface IClient
{
///
/// create the address or the name of the file storing the data
///
string getAddress();
///
/// uses a WebClient to go and get the data at the address indicated
///
string getData(string adress);
///
/// Write the data in a local folder
///
void writeData(string data);
}
//Implementation A
public class ClientA : IClient
{
// Specify the type of the file to be queried in the database
// could be a csv or an xml for example
private readonly string _FileType;
public ClientA(string fileType)
{
_FileType = fileType;
}
public string getAddress()
{
return "addressOfFileContainingData." + _FileType;
}
public string getData(string address)
{
string data = string.Empty;
using (WebClient client = new WebClient())
{
data = client.DownloadString(address);
}
return data;
}
public void writeData(string data)
{
string localAddress = "C:/Temp/";
using (StreamWriter writer = new StreamWriter(localAddress))
{
writer.Write(data);
}
}
}
//Implementation B
public class ClientB : IClient
{
public ClientB()
{
}
public string getAddress()
{
return "addressOfFileContainingData";
}
public string getData(string address)
{
string data = string.Empty;
using (WebClient client = new WebClient())
{
data = client.DownloadString(address);
}
return data;
}
public void writeData(string data)
{
string localAddress = "C:/Temp/";
using (StreamWriter writer = new StreamWriter(localAddress))
{
writer.Write(data);
}
}
}
public class DependencyContainer
{
private Dictionary _Map = new Dictionary();
public void Register()
{
_Map.Add(typeof(TypeToResolve), typeof(ResolvedType));
}
public T Resolve(params object[] constructorParameters)
{
return (T)Resolve(typeof(T), constructorParameters);
}
public object Resolve(Type typeToResolve, params object[] constructorParameters)
{
Type resolvedType = _Map[typeToResolve];
ConstructorInfo ctorInfo = resolvedType.GetConstructors().First();
object retObject = ctorInfo.Invoke(constructorParameters);
return retObject;
}
}
< /code>
} < /p>
Я склонен думать, что в этом коде есть несколько хороших моментов, но не стесняйтесь меня исправить. Однако экземпляры: < /p>
IClient client = container.Resolve("xml");
< /code>
и < /p>
IClient client = container.Resolve();
< /code>
Нарисуйте для меня много проблем. Модуль высокого уровня (пользователь класса здесь) не зависит от конкретной реализации, как и ожидалось. Однако теперь программа класса зависит от структуры конструктора бетонного класса! Таким образом, это решает одну проблему, создавая гораздо большую проблему где -то еще. Я бы предпочел зависеть от конкретной реализации, а не от структуры его конструктора. Давайте представим, что код клиентов рефактор, и конструктор изменяется, тогда я понятия не имею, что в программе класса на самом деле используется. Чтобы решить эту проблему? Но означает ли это, что конструктор никогда не должен иметь никаких аргументов при использовании контейнера для зависимости? Или это означает, что объект с аргументами в его конструкторе не является хорошим кандидатом для такого рода техники?>
Подробнее здесь: https://stackoverflow.com/questions/344 ... nstructors
Контейнер и конструкторы зависимости ⇐ C#
Место общения программистов C#
1755845298
Anonymous
Я провел некоторое время, документируя себя на инъекцию зависимости и МОК, но я не нашел решение моей проблемы. Почти в каждом примерах, с которыми я сталкивался, конструкторы бетонных классов не имеют никаких аргументов. Это делает все довольно «простым». Следовательно, мой вопрос здесь. < /P>
Давайте возьмем пример: мне нужно загрузить некоторые данные из двух источников A и B. Источник A содержит данные в различном формате; Например, CSV и XML. Нам не нужно указывать такую вещь для источника B. < /p>
Вот какой -то код (обратите внимание, я упростил код как можно больше, чтобы проиллюстрировать свою точку зрения): < /p>
using System.Net;
using System.IO;
using System.Reflection;
namespace Question
{
class Program
{
static void Main(string[] args)
{
//exemple of code using Client A
DependencyContainer container1 = GetContainer1();
IClient client1 = container1.Resolve("xml");
User user1 = new User(client1);
user1.run();
DependencyContainer container2 = GetContainer2();
IClient client2 = container2.Resolve();
User user2 = new User(client2);
user2.run();
}
public static DependencyContainer GetContainer1()
{
DependencyContainer container = new DependencyContainer();
container.Register();
return container;
}
public static DependencyContainer GetContainer2()
{
DependencyContainer container = new DependencyContainer();
container.Register();
return container;
}
}
public class User
{
private readonly IClient _Client;
public User(IClient client)
{
_Client = client;
}
public void run()
{
string address = _Client.getAddress();
string data = _Client.getData(address);
_Client.writeData(data);
}
}
// Abstraction
public interface IClient
{
///
/// create the address or the name of the file storing the data
///
string getAddress();
///
/// uses a WebClient to go and get the data at the address indicated
///
string getData(string adress);
///
/// Write the data in a local folder
///
void writeData(string data);
}
//Implementation A
public class ClientA : IClient
{
// Specify the type of the file to be queried in the database
// could be a csv or an xml for example
private readonly string _FileType;
public ClientA(string fileType)
{
_FileType = fileType;
}
public string getAddress()
{
return "addressOfFileContainingData." + _FileType;
}
public string getData(string address)
{
string data = string.Empty;
using (WebClient client = new WebClient())
{
data = client.DownloadString(address);
}
return data;
}
public void writeData(string data)
{
string localAddress = "C:/Temp/";
using (StreamWriter writer = new StreamWriter(localAddress))
{
writer.Write(data);
}
}
}
//Implementation B
public class ClientB : IClient
{
public ClientB()
{
}
public string getAddress()
{
return "addressOfFileContainingData";
}
public string getData(string address)
{
string data = string.Empty;
using (WebClient client = new WebClient())
{
data = client.DownloadString(address);
}
return data;
}
public void writeData(string data)
{
string localAddress = "C:/Temp/";
using (StreamWriter writer = new StreamWriter(localAddress))
{
writer.Write(data);
}
}
}
public class DependencyContainer
{
private Dictionary _Map = new Dictionary();
public void Register()
{
_Map.Add(typeof(TypeToResolve), typeof(ResolvedType));
}
public T Resolve(params object[] constructorParameters)
{
return (T)Resolve(typeof(T), constructorParameters);
}
public object Resolve(Type typeToResolve, params object[] constructorParameters)
{
Type resolvedType = _Map[typeToResolve];
ConstructorInfo ctorInfo = resolvedType.GetConstructors().First();
object retObject = ctorInfo.Invoke(constructorParameters);
return retObject;
}
}
< /code>
} < /p>
Я склонен думать, что в этом коде есть несколько хороших моментов, но не стесняйтесь меня исправить. Однако экземпляры: < /p>
IClient client = container.Resolve("xml");
< /code>
и < /p>
IClient client = container.Resolve();
< /code>
Нарисуйте для меня много проблем. Модуль высокого уровня (пользователь класса здесь) не зависит от конкретной реализации, как и ожидалось. Однако теперь программа класса зависит от структуры конструктора бетонного класса! Таким образом, это решает одну проблему, создавая гораздо большую проблему где -то еще. Я бы предпочел зависеть от конкретной реализации, а не от структуры его конструктора. Давайте представим, что код клиентов рефактор, и конструктор изменяется, тогда я понятия не имею, что в программе класса на самом деле используется. Чтобы решить эту проблему? Но означает ли это, что конструктор никогда не должен иметь никаких аргументов при использовании контейнера для зависимости? Или это означает, что объект с аргументами в его конструкторе не является хорошим кандидатом для такого рода техники?>
Подробнее здесь: [url]https://stackoverflow.com/questions/34464597/dependency-container-and-constructors[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия