Как внедрить зависимости в WCF, когда корень композиции находится на клиенте - PullRequest
3 голосов
/ 26 ноября 2011

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

Я кодирую упражнение, взяв образцы из двухкниги:
1. Внедрение зависимостей в .Net Марка Симанна
2. Профессиональные шаблоны проектирования ASP .Net Брайана Игана и Стива Валенсуэлы

В упражнении реализуется шаблон обмена сообщениями «запрос / ответ» с использованием WCF.в качестве уровня обслуживания И с использованием внедрения зависимостей из корня композиции в клиентском приложении.

От 2:
В упражнении для уровня обслуживания у меня есть пять библиотек классов:
- Контракты: с интерфейсами для контрактов сервисов.
- Контракты с данными: со всеми объектами, которые оформлены с помощью DataContractAttribute
- HttpHost: хост для сервисов WCF.Эта библиотека содержит все файлы svc
- ServiceProxy: эта библиотека вручную реализует прокси сервисов для клиентов, чтобы использовать
- Services: содержит реализации сервисов.

От 1:
Я хочу протестировать это упражнение как с консолью, так и с клиентами ASP .Net MVC, поэтому корни композиции являются основным методом для первого, а также Global.asax и фабрикой пользовательских контроллеров.комбинация для второго.

Итак, мои вопросы:

  1. Если корень композиции внедряется на клиенте, должен ли я пока предоставить пользовательскую реализацию для ServiceHostFactory,ServiceHost, а IInstanceProvider в WCF?Разве это не заставит меня иметь два корня композиции?
  2. Если (надеюсь) мне нужен только корень композиции в клиенте, где я могу создать конструкторы с зависимостями?В реализации сервиса или в прокси сервиса или в обоих?
  3. Как настроить иерархию объектов?Я хочу сначала использовать DI Бедного Человека и, когда он запустится, включить Структурную Карту в качестве контейнера IoC.

Большое спасибо за вашу помощь.

Это код, который у меня есть (я не включаю ни контракт на обслуживание, ни контракт на передачу данных):

Реализация сервиса:

namespace Exercise.Services
{
    public class PurchaseOrderService : IPurchaseOrderService
    {

        private readonly IPurchaseOrderFacade PurchaseOrderFacade;

        public PurchaseOrderService(IPurchaseOrderFacade purchaseOrderFacade)
        {
            PurchaseOrderFacade = purchaseOrderFacade;
        }

        public PurchaseOrderResponse CreatePurchaseOrder(PurchaseOrderRequest purchaseOrderRequest)
        {
            var purchaseOrder = PurchaseOrderFacade.CreatePurchaseOrder(purchaseOrderRequest.ToPurchaseOrder());

            var purchaseOrderResponse = purchaseOrder.ToPurchaseOrderResponse();
            purchaseOrderResponse.IsSuccessful = true;

            return purchaseOrderResponse;
        }

        public PurchaseOrderResponse UpdateState(PurchaseOrderRequest purchaseOrderRequest)
        {
            var purchaseOrder = PurchaseOrderFacade.UpdateState(purchaseOrderRequest.ToPurchaseOrder());

            var purchaseOrderResponse = purchaseOrder.ToPurchaseOrderResponse();
            purchaseOrderResponse.IsSuccessful = true;

            return purchaseOrderResponse;
        }
    }
}

Этопрокси для клиента:

namespace Exercise.ServiceProxy
{
    public class PurchaseOrderProxy : ClientBase<IPurchaseOrderService>, IPurchaseOrderService
    {
        public PurchaseOrderResponse CreatePurchaseOrder(PurchaseOrderRequest purchaseOrderRequest)
        {
            return base.Channel.CreatePurchaseOrder(purchaseOrderRequest);
        }

        public PurchaseOrderResponse UpdateState(PurchaseOrderRequest purchaseOrderRequest)
        {
            return base.Channel.UpdateState(purchaseOrderRequest);
        }
    }
}

1 Ответ

4 голосов
/ 26 ноября 2011

Каждое приложение имеет свой собственный корень композиции.Служба WCF сама по себе является приложением и означает, что у нее есть собственный корень композиции.

Или, позвольте мне сказать по-другому, клиенты не должны диктовать, как служба собирается строить свои графы объектов, и это трудно представить, поскольку служба будет жить в своем собственном процессе и чаще всего в отдельноммашина.

Это не означает, что несколько приложений (например, в одном и том же решении) не могут совместно использовать часть конфигурации DI, но графы объектов клиента и службы, вероятно, будут иметь мало общего (они не разделяют большую часть одной и той же базы кода).Вы увидите гораздо больше общего доступа к конфигурации, когда вы, например, создаете службу WCF и службу Windows, которые используют один и тот же бизнес-уровень.Но даже в этом случае, хотя они, возможно, разделяют большую часть конфигурации DI, мы все равно скажем, что у них есть собственный корень композиции.

...