我们已在公司开始新项目。我们按如下方式确定架构
有以下5个不同的项目
1)包含DataContract的BusinessEntities(类库)如下
[DataContract]
public class Cities
{
/// <summary>
/// Gets or sets City Id
/// </summary>
[DataMember]
public int Id { get; set; }
/// <summary>
/// Gets or sets City name
/// </summary>
[DataMember]
[Display(Name = "CityName", ResourceType = typeof(DisplayMessage))]
[Required(ErrorMessageResourceName = "CityName", ErrorMessageResourceType = typeof(ErrorMessage))]
[RegularExpression(@"[a-zA-Z ]*", ErrorMessageResourceName = "CityNameAlphabates", ErrorMessageResourceType = typeof(ErrorMessage))]
[StringLength(50, ErrorMessageResourceName = "CityNameLength", ErrorMessageResourceType = typeof(ErrorMessage))]
public string Name { get; set; }
}
2)包含
的界面 [ServiceContract]
public interface ICity : IService<CityViewModel>
{
[OperationContract]
Status Add(Cities entity);
}
3)包含WCF服务实现的DAL
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class City : ICity
{
public Status Add(Cities entity)
{
//Insert Logic goes here
}
}
4)调用WCF服务的Web组件
public class City
{
public static Status Add(Cities entity)
{
using (var service = new WcfServiceProvider<ICity>())
{
return service.GetProxy().Add(entity);
}
}
}
5)UI(Asp.Net MVC项目),它调用webcomponent来访问服务
City.Add(entity);
现在我们完成这个结构。但问题是如何使用存储库模式进行单元测试?如果是的话,是否可以在此结构上使用存储库模式?或者我们还有其他模式吗?
答案 0 :(得分:2)
我建议您阅读有关问题的分离。现在,您正在使用业务对象作为DTO和BO。这有效地将您的WCF服务与您的域图层和UI层结合在一起。
这意味着版本控制将无法进行。如果您想在UI或DL中进行任何更改,您必须确保所有更改都在两个层中进行,否则UI将无法与BL通信。
拥有专用的DTO要好得多,因为您可以更轻松地处理版本问题(例如默认值或新引入的属性等)。
您的命名没有意义。您的Cities
课程包含一个城市,对吧?你为什么不给它命名City
。
[ServiceContract]
public interface ICity : IService<CityViewModel>
{
[OperationContract]
Status Add(Cities entity);
}
您能解释服务定义是什么吗?我没有看到视图模型和DTO之间的关系。同样的事情在这里。名称ICity
具有误导性。如果它是一个存储库名称就是这样的。我们大多数人使用City
名称来指出我们使用的对象,并使用其他名称(如ICityService
或ICityRepository
)来指出访问技术。
现在回答真正的问题:
但问题是如何使用存储库模式进行单元测试?
你没有。
存储库的唯一责任是在数据源中加载和存储数据。您当然可以模拟DbConnection
等。但由于存储库与数据源有效耦合,因此无法保证任何内容。如果你使用模拟,你仍会因错误的SQL查询,无效的列类型,不正确的表关系等而失败。
因此,如果您确实希望确保存储库正常工作,则必须查询数据库。