Дизайн класса в соответствии с IOC и абстрактным заводским шаблоном

StackOverflow https://stackoverflow.com/questions/3450518

  •  27-09-2019
  •  | 
  •  

Вопрос

Какой правильный способ обеспечения ценностей в абстрактный фабричный метод?

Например.

interface IFactory
{
  ISomething Create(int runTimeValue);
}

class Factory : IFactory
{
  public ISomething Create(int runTimeValue)
  {
    return new Something(repository, runTimeValue);
  }
}

В примере репозиторий вводится через конструктор, когда завод создан, но я могу вместо этого мог переместить репозиторий в интерфейс ifactory

interface IFactory
{
  ISomething Create(IRepository repository, int runTimeValue);
}

class Factory : IFactory
{
  public ISomething Create(IRepository repository, int runTimeValue)
  {
    return new Something(repository, runTimeValue);
  }
}

Что считается «правильным» способом этого? Как по одной причинами при разработке абстрактной фабрики?

Это было полезно?

Решение

Абстрактный фабричный рисунок Следует использоваться в случаях, когда объекты, возвращаемые заводом, должны быть «инициализированы» по-разному таким образом, что только завод знает, как это сделать. Таким образом, разные реализации исчезтования будут «инициализированы» или созданы по-разному, и только их соответствующие фабричные реализации знают, как это сделать.

В вашем случае вы должны спросить себя:

Делать все Реализации ISOMETHINGS Нужна ирпозитория, а также рутимевале? В этом случае вы можете просто использовать фабричный шаблон.

Используйте абстрактную фабрику в таком сценарии: (что-то и всеграмоты, созданные по-разному)

interface IFactory {
  ISomething Create(int runTimeValue);
}

class Factory : IFactory {
  public ISomething Create(int runTimeValue)  {
    return new Something(repository, runTimeValue);
  }
}

class OFactory : IFactory {
  public ISomething Create(int runTimeValue) {
    // constructor takes different parameters
    SomeOtherthing thing = new SomeOtherthing("someValue", runtimeValue);
    thing.SetCustomRepository(new OtherRepositoryImpl());
    return thing;
  }
}

Другие советы

Я бы сказал быть последовательным. Если ваш репозиторий вводится везде, что он используется, он имеет смысл ввести его в конструктор фабрики, а не сделать его частью интерфейса.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top