WCF 设计:避免接口重复
WCF Design: Avoiding Interface Duplication
我发现自己被吸引到在这种情况下使用两个相同的界面,这似乎不对。然而,替代方案似乎是在我的服务中使用 WCF 装饰界面,这也感觉不对。
示例如下
这是我的 WCF 服务的界面
[ServiceContract(Namespace="http://MyNameSpace")]
public interface IGetDataService
{
[OperationContract]
List<MyDataObject> GetData();
}
现在,假设该服务仅从数据库中获取数据。我需要一个实现来促进这种检索。这个 class 是否也应该实现 IGetDataService 因为方法是相同的?或者我应该有另一个接口,例如 IDataRepository:
public interface IDataRepository
{
List<MyDataObject> GetData();
}
请注意,此接口在签名方面与 IGetDataService 相同。唯一的区别是缺少WCF相关属性。
class DatabaseDataRepository: IDataRepository
{
public List<MyDataObject> GetData()
{
// code to query database here
// return populated List<MyDataObject>
}
}
以及 WCF 服务本身的实现(为了完整性):
class DataService: IGetDataService
{
public List<MyDataObject> GetData()
{
var repository = MyIocContainer.GetInstance<IDataRepository>();
return repository.GetData();
}
}
所以,总结一下:我需要 IDataRepository 还是 IGetDataService 可以在内部重用?
我相当有信心两者都能奏效 - 对设计最佳实践感兴趣。
这真的是一个喜好问题。
我会使用两种不同的界面。它的开销有点大,但它允许两个合约在不同的方向上弯曲。
例如,如果您的 WCF 服务需要公开一个新服务,您也不必更改存储库接口。
我发现自己被吸引到在这种情况下使用两个相同的界面,这似乎不对。然而,替代方案似乎是在我的服务中使用 WCF 装饰界面,这也感觉不对。
示例如下
这是我的 WCF 服务的界面
[ServiceContract(Namespace="http://MyNameSpace")]
public interface IGetDataService
{
[OperationContract]
List<MyDataObject> GetData();
}
现在,假设该服务仅从数据库中获取数据。我需要一个实现来促进这种检索。这个 class 是否也应该实现 IGetDataService 因为方法是相同的?或者我应该有另一个接口,例如 IDataRepository:
public interface IDataRepository
{
List<MyDataObject> GetData();
}
请注意,此接口在签名方面与 IGetDataService 相同。唯一的区别是缺少WCF相关属性。
class DatabaseDataRepository: IDataRepository
{
public List<MyDataObject> GetData()
{
// code to query database here
// return populated List<MyDataObject>
}
}
以及 WCF 服务本身的实现(为了完整性):
class DataService: IGetDataService
{
public List<MyDataObject> GetData()
{
var repository = MyIocContainer.GetInstance<IDataRepository>();
return repository.GetData();
}
}
所以,总结一下:我需要 IDataRepository 还是 IGetDataService 可以在内部重用?
我相当有信心两者都能奏效 - 对设计最佳实践感兴趣。
这真的是一个喜好问题。
我会使用两种不同的界面。它的开销有点大,但它允许两个合约在不同的方向上弯曲。
例如,如果您的 WCF 服务需要公开一个新服务,您也不必更改存储库接口。