2

Возможно, это слишком широкий вопрос, но я все еще хочу услышать, какие лучшие практики и что считается «правильным». Я не нашел подобную тему, возможно, из-за того, насколько она типична и поэтому трудно найти.Что мне следует кодировать в «основном» методе?

Все это началось, когда мы взяли проект службы Windows и добавили к нему еще одну услугу. Раньше основным методом было то, что мы рассмотрели Состав Root, и наш код регистрации контейнера IoC, чтение app.config и тому подобное были в основном методе в той или иной форме. После сборки необходимых зависимостей мы создали службу, позвонив по контейнеру Resolve и запустив его.

Когда мы создали другой класс, наследующий от ServiceBase, мы заметили, что нет смысла иметь основной корневой состав больше, потому что несколько служб потенциально полностью разные и, следовательно, требуют другого кода инициализации.

Единственный просветительский пост, который я нашел на матере, был this one from Mark Seemann, где он утверждает, что OnStart будет совокупным корнем (в данном конкретном случае).

В целом, какой подход лучше всего подходит при выборе и соответствующем корне композиции? Должен ли я рассматривать этот сценарий службы Windows как выброс и просто код по-разному для него, оставив основной метод в качестве других корней композиций типов проектов, или существует более общий подход, который будет действителен во всех контекстах?

Возможно, тот факт, что услуги требуют очень разных настроек, является индикатором того, что они должны быть разделены в нескольких автономных проектах, где основной будет снова использоваться в качестве корня композиции?

Обычно мы используем .Net, но это, вероятно, относится ко многим другим языкам программирования.

ответ

0

Лучше всего думать о методе Main() как о простом крюке, который требуется ОС - и это должно быть его единственной обязанностью. В нем должно быть как можно меньше кода, только минимальный минимум, необходимый для запуска реального приложения - он не должен быть частью каких-либо концептуальных соображений.

+0

Какое ваше предложение затем для чего ввести код инициализации? Например, настройка контейнера, конфигурация журнала. Может ли создать небольшой образец для этого? – julealgon

+0

Зависит. В вашем случае я бы написал метод (называемый «Init()» или тому подобное) и вызывается этот метод из «Main()». Тогда у меня будет метод 'Run()' (который по сути представляет собой бесконечный цикл, который ждет чего-то), наконец, в конечном итоге метод «CleanUp()». Сначала будет читать «{Init(); Бег(); CleanUp(); } '. –

+0

Обратите внимание, что описанный случай имеет два независимых сервиса. Если я сделаю то, что вы предлагаете, я бы связал их в одиночных методах инициализации, и у меня не может быть приоритета между ними: представьте, что у меня есть две службы в одном процессе, а вторая зависит от первого запуска. Если я использую класс программы в качестве корня композиции, как вы предполагаете, я не смог бы правильно инициализировать вторую службу, потому что первая не будет работать уже. – julealgon

Смежные вопросы