0

我们在公司开始了新项目。我们最终确定架构如下

有5个不同的项目如下

1)BusinessEntities(类库),其中包含如下DataContract

  [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服务的Webcomponent

public class City
{
    public static Status Add(Cities entity)
    {
        using (var service = new WcfServiceProvider<ICity>())
        {
            return service.GetProxy().Add(entity);
        }
    }
}

5)调用webcomponent访问服务的UI(Asp.Net MVC项目)

City.Add(entity);

现在我们最终确定这个结构。但问题是如何使用存储库模式进行单元测试?如果可以,是否可以在此结构上使用存储库模式?还是我们必须使用其他任何模式?

4

1 回答 1

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名称来指出我们使用的对象,并使用其他名称,例如ICityServiceICityRepository指出访问技术。


现在到真正的问题:

但问题是如何使用存储库模式进行单元测试?

你没有。

存储库的唯一职责是在数据源中加载和存储数据。您当然可以模拟DbConnection等。但这根本不能保证任何事情,因为存储库有效地耦合到数据源。如果你使用 mock,你仍然会因为不正确的 SQL 查询、无效的列类型、不正确的表关系等而失败。

因此,如果您真的想确保存储库正常工作,您必须查询数据库。

于 2013-05-02T11:26:58.670 回答