Разделение сборок с веб-ссылками
Мне любопытно, как другие справятся с этой ситуацией. У меня есть слой домена, который включает в себя объект Address. Затем у меня есть приложение, которое использует этот объект. Кроме того, существует веб-служба asmx asp.net, которая выполняет проверку адреса, обращаясь к стороннему веб-сервису.
Мне интересно, как бороться с этим функционалом. Я не хочу помещать ссылку на сервис и код для доступа к веб-сервису на уровне домена. Также кажется неправильным помещать это в прикладной уровень.
Мое настоящее лучшее решение - создать третью сборку, которая ссылается на исходный слой домена И веб-службу проверки. Это делает мой доменный слой немного чище без внешних ссылок. Как бы вы справились с этой ситуацией?
1 ответ
Ну, проверяет ли адресную часть логики приложения или часть требований вашего домена?
Если это функция приложения, она идет на уровне приложения. Если это основная функция домена, она идет на уровне домена.
Если вы беспокоитесь о связи - например, если вы думаете, что в будущем вы решите использовать другую службу проверки адресов - поместите над ней абстракцию. Создайте интерфейс и класс-оболочку:
public interface IAddressValidator
{
bool ValidateAddress(Address address);
}
public class FooAddressValidator : IAddressValidator
{
private FooService service;
public FooAddressValidator(FooService service)
{
this.service = service;
}
public bool ValidateAddress(Address address)
{
return service.ValidateAddress(address.StreetLine1, address.City,
address.State, address.Country);
}
}
Или какова бы ни была логика. Затем сделайте ваше приложение (или модель предметной области) зависимым от IAddressValidator
вместо самой услуги и вентилятора в бетоне IAddressValidator
экземпляр из самого внешнего слоя.
Вы могли бы поставить ядро IAddressValidator
интерфейс в вашей доменной модели и сохранить FooAddressValidator
во внешней сборке, на которую ссылается только исполняемый файл. Таким образом, ваш домен на самом деле не зависит от веб-службы, но у вас все еще есть проверка адреса как часть логики вашего домена.
Это также значительно упрощает тестирование любого компонента, использующего проверку адреса, поскольку на самом деле вам не нужно совершать вызовы веб-службы, вы можете использовать другой MockAddressValidator
пример для этого.