Re[5]: Конструктор с параметрами vs метод Init -- стоит ли и
От: _NN_ www.nemerleweb.com
Дата: 31.03.16 15:12
Оценка:
Здравствуйте, 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) { ... }
}
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.