Здравствуйте, Shmj, Вы писали:
S>Здравствуйте, _NN_, Вы писали:
S>>>При использовании контрактов двухуровневой не избежать.
_NN>>Можно пример ?
S>Упрощенный пример:
S> | Скрытый текст |
| S>S>using System;
S>namespace ConsoleApplication30
S>{
S> class Program
S> {
S> class Settings
S> {
S> public string LocalFolder { get; set; }
S> }
S> interface IFileService
S> {
S> // Нужно иметь гарантию что установлены настройки
S> void Init(Settings settings);
S> void DownloadFile(string fileName);
S> }
S> class TestFileService : IFileService
S> {
S> private Settings _settings;
S> public void Init(Settings settings)
S> {
S> _settings = settings;
S> }
S> public void DownloadFile(string fileName)
S> {
S> Console.WriteLine("Скачиваем файл " + fileName + " и сохраняем в папку " + _settings.LocalFolder);
S> }
S> }
S> static void Main(string[] args)
S> {
S> // Получаем необходимую реализацию через unityContainer
S> //IFileService fileService = unityContainer.Resolve<IFileService>()
S> // Для упрощения заменим:
S> IFileService fileService = new TestFileService();
S> // Вместо Init можно было бы задействовать InjectionConstructor, но это никак бы не отразилось на контракте.
S> // По этому в контракте нужно либо сделать свойство Settings, либо метод Init. Поскольку при инициализации не просто устанавливаем значение, а и производим действия -- то метод.
S> fileService.Init(new Settings {LocalFolder = "C:\\temp"});
S> fileService.DownloadFile("fileName.txt");
S> }
S> }
S>}
S>
|
| |
Пример похоже слишком простой.
Неясно почему тот же TestFileServices не может в конструкторе принимать Settings.
И вообще какое дело интерфейсу до этого.
Интерфейс описывает желаемое поведение, а как оно задается это дело конкретного класса.
interface IFileService
{
void DownloadFile(string fileName);
}
class TestFileService : IFileService
{
public TestFilerService(Settings settings) { .. }
public void DownloadFile(string fileName) { ... }
}
class AdvancedTestFileService : IFileService
{
public AdvancedTestFileService(AdvancedSettings settings) { .. } // Тут требуем другие настройки
public void DownloadFile(string fileName) { ... }
}
class DefaultFileService : IFileService
{
public DefaultFileService() { .. } // Тут например не требуется ничего.
public void DownloadFile(string fileName) { ... }
}