МОК и динамические параметры - PullRequest
1 голос
/ 18 мая 2009

Я прочитал несколько постов о том, как не смешивать параметры при переходе в конструктор, но у меня есть вопрос. У меня есть классы, и все они зависят от параметра компании, все методы зависят от компании. Я не хочу передавать компанию при каждом вызове метода, я хотел бы передать это в конструктор. Это усложняет классы, потому что я должен в значительной степени убедиться, что конструкторы конкретных классов принимают определенные параметры, которые я не фанат (не могу включить это в контракт, который является интерфейсом). Рекомендовать просто передавать компанию в каждый вызов метода в классе ???

Ответы [ 5 ]

4 голосов
/ 18 мая 2009

Если для всех методов требуется название компании, то вполне разумно с точки зрения разработки ООП передать это название компании в конструктор вашего класса. Это означает, что ваш класс не может работать правильно без названия компании, поэтому любой потребитель этого класса будет вынужден предоставить требуемую зависимость.

2 голосов
/ 18 мая 2009

Если вы не работаете с известной платформой IoC, которая уже обрабатывает это для вас, вы всегда можете реализовать это как внедрение свойства. Не то чтобы я также видел проблему с выполнением этого на уровне конструктора - вы действительно не сказали, почему чувствуете, что это проблема.

Конечно, не рекомендую передавать его каждому методу (явно избыточно).

0 голосов
/ 20 мая 2009

У вас может быть ICommonSettings (почти как глобальный статический класс), который внедряется в ваш менеджер входа в систему (для задания имени компании) и в объект, о котором вы говорите. Тогда вы освобождаетесь от необходимости передавать его конструктору или методу.

0 голосов
/ 18 мая 2009

Если поведение вашего класса зависит от названного названия компании, что плохого в том, чтобы передать его конструктору? Конструктор сам по себе является контрактом - вам нужно будет что-то создать для него.

0 голосов
/ 18 мая 2009

Да, в мире IoC большинство инструментов (Spring.Net, Castle Windsor, даже LinFu) имеют методы, которые могут позаботиться об этом за вас, поэтому вы определяете его один в конфигурации и каждый раз, когда получаете копию контейнер или что-то еще) он поставляется предварительно настроенным.

Вы можете обернуть свой «контейнер»

IWindsorContainer _ConfiguredContainer = null;

public IWindsorContainer GetContainer()
{
   if (LoggedIn == false)
      throw new InvalidOperationException("Cannot be called before a user logs in");

   if (_ConfiguredContainer == null)
   {
      _ConfiguredContainer = new WindsorContainer(new XmlInterpreter());

      // Do your 'extra' config here.
      _ConfiguredContainer.AddComponentWithProperties(/*blah blah blah*/);
   }

   return _ConfiguredContainer;
} 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...