使用SOA架构在Asp.Net MVC中实现存储库模式

时间:2013-05-02 04:51:32

标签: wcf unit-testing asp.net-mvc-4 architecture repository-pattern

我们已在公司开始新项目。我们按如下方式确定架构

有以下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);

现在我们完成这个结构。但问题是如何使用存储库模式进行单元测试?如果是的话,是否可以在此结构上使用存储库模式?或者我们还有其他模式吗?

1 个答案:

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


现在回答真正的问题:

  

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

你没有。

存储库的唯一责任是在数据源中加载和存储数据。您当然可以模拟DbConnection等。但由于存储库与数据源有效耦合,因此无法保证任何内容。如果你使用模拟,你仍会因错误的SQL查询,无效的列类型,不正确的表关系等而失败。

因此,如果您确实希望确保存储库正常工作,则必须查询数据库。