Правило «Хранить в IoC только контейнерные сервисы. Не хранить никаких сущностей». Я нашел в этом блоге , и у него много сторонников.
Есть также пример конструктора класса:
MyClass(ILog log,
IAudit audit,
IPermissions permissions,
IApplicationSettings settings) {/*..*/}
где MyClass был объявлен как объект, который не должен храниться в контейнере.
Таким образом, «готовый сервис IoC» не может зависеть от инфраструктуры .. услуг.
Но теперь я совершенно не понимаю, как «люди IoC» работают с «реальным кодом». Служба в C # по-прежнему будет разрабатываться как класс, и этот класс обычно зависит от класса, который инкапсулирует ведение журнала, редко зависит от класса, который инкапсулирует пользовательскую обработку исключений (например, преобразование необработанного исключения в FaultContract) и т. Д. ...
Я вижу несколько способов:
Может быть, они просто не объявляют эти зависимости инфраструктуры? Использовать их как функциональность, доступную из статических методов?
Или, может быть, «сторонники IoC» считают, что служба «IoC ready» должна публиковать события log / trace / authenticate / handleException как часть контракта на обслуживание (и тогда да - нет «зависимостей от инфраструктуры»)? Но это также означает, что такой сервис должен быть дуплексным (для публикации событий журнала) ...
Может быть, их "услуги" - это только прокси? Прокси не зависят от инфраструктуры, поскольку вся инфраструктура удаленная, но я не рад, что контейнер IoC следует использовать для хранения только прокси. Я прав в своем разочаровании? Но тогда как насчет MS Enterprise Library, которая предназначена для хранения логгеров и обработчиков в контейнере Unity?
APPEND:
Я так понимаю: есть сервисы (с контрактами), есть юридические лица (бизнес) и есть инфраструктурные вещи LogWriter, AuthenticationProvider; - создание / хостинг-сервис. Я инициирую его с помощью некоторых инфраструктурных вещей (поэтому я публикую зависимости от инфраструктуры, а не от субъектов). Что я до сих пор не понимаю, прав я в этом или нет?
ПРИЛОЖЕНИЕ 2:
После обсуждения я понимаю ситуацию таким образом. ILog и т. Д. - это сервисы (даже если они являются инфраструктурными сервисами), и поэтому, если «MyClass» является реализацией некоторого сервиса, правило не нарушается. Это означает, что правило хорошее, а образец плохой.
Осталась одна проблема: я все еще не понимаю противопоставление сущностей и услуг в одном предложении без объяснения причин. Они из разных концептуальных слоев: 1) сервис-сообщения; и 2) бизнес-правила-сущности. Поэтому, возможно, сначала я должен принять новую терминологию.