我很好奇其他人如何处理这种情况。我有一个包含Address对象的域层。然后我有一个使用此对象的应用程序。此外,还有一个asp.net asmx Web服务,通过访问第三方Web服务来执行地址验证。
我很好奇如何处理这个功能。我不想将服务引用和代码放在域层中访问Web服务。将它放在应用程序层中似乎也是错误的。
我目前最好的解决方案是创建一个引用原始域层和验证Web服务的第三个程序集。这使我的域图层更清晰,没有外部引用。你会如何处理这种情况?
答案 0 :(得分:0)
那么,是在验证应用程序(UI)逻辑的地址部分还是域要求的一部分?
如果是app功能,它会进入app层。如果它是核心域函数,它将进入域层。
如果你担心耦合 - 例如,如果你认为将来可能决定使用不同的地址验证服务 - 那么就对它进行抽象。创建一个接口和一个包装类:
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
保留在只有可执行文件引用的外部程序集中。这样,您的域实际上并不依赖于Web服务,但您仍然将域验证作为域逻辑的一部分。
这也使得地址验证组件的使用更容易测试,因为您实际上不需要进行Web服务调用,您可以使用不同的MockAddressValidator
实例。