Прежде чем начать, я должен сказать, что, возможно, я кусаю больше, чем могу жевать, но у меня отчаянное буйство к обучению, и мне нужна большая помощь.
Я кодирую упражнение, взяв образцы из двухкниги:
1. Внедрение зависимостей в .Net Марка Симанна
2. Профессиональные шаблоны проектирования ASP .Net Брайана Игана и Стива Валенсуэлы
В упражнении реализуется шаблон обмена сообщениями «запрос / ответ» с использованием WCF.в качестве уровня обслуживания И с использованием внедрения зависимостей из корня композиции в клиентском приложении.
От 2:
В упражнении для уровня обслуживания у меня есть пять библиотек классов:
- Контракты: с интерфейсами для контрактов сервисов.
- Контракты с данными: со всеми объектами, которые оформлены с помощью DataContractAttribute
- HttpHost: хост для сервисов WCF.Эта библиотека содержит все файлы svc
- ServiceProxy: эта библиотека вручную реализует прокси сервисов для клиентов, чтобы использовать
- Services: содержит реализации сервисов.
От 1:
Я хочу протестировать это упражнение как с консолью, так и с клиентами ASP .Net MVC, поэтому корни композиции являются основным методом для первого, а также Global.asax и фабрикой пользовательских контроллеров.комбинация для второго.
Итак, мои вопросы:
- Если корень композиции внедряется на клиенте, должен ли я пока предоставить пользовательскую реализацию для ServiceHostFactory,ServiceHost, а IInstanceProvider в WCF?Разве это не заставит меня иметь два корня композиции?
- Если (надеюсь) мне нужен только корень композиции в клиенте, где я могу создать конструкторы с зависимостями?В реализации сервиса или в прокси сервиса или в обоих?
- Как настроить иерархию объектов?Я хочу сначала использовать 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);
}
}
}