3层架构NHibernate + WCF + Silverlight

5

最近我被要求开发一个项目,架构如下:

  • 第一层:基于Nhibernate的数据访问
  • 第二层:基于WCF服务和一些核心类的业务层
  • 第三层:基于Silverlight的视图

我将使用DTO对象在第二层和第三层之间传递数据。

我已经意识到,该项目将拥有巨大的领域模型,并且许多业务实体应支持标准和自定义的CRUD操作。在第一层中,这将通过通用的NHibernate Repository + Specification解决。

但是,第二层(一个WCF服务)将看起来像一组方法,为第三层提供自定义和标准的DTO CRUD接口。

例如,模型如下:

class Product {}
class Category {}

DTOs:

class ProductDTO {}
class CategoryDTO {}

"问题" WCF 服务:

public class DataService
{
  public List<CategoryDTO> GetAllCategories()
  {
  }

  public List<ProductDTO> GetAllProducts()
  {
  }
}

可能的解决方案:
public class ProductDataService
{
  public List<ProductDTO> GetAllProducts()
  {
  }
}

 public class CategoryDataService
{
  public List<CategoryDTO> GetAllCategories()
  {
  }
}

问题:

  1. 是否有好的替代方案来解决上述问题?
  2. 在WCF服务中,是否有可以用于此情况的“通用”方法?
2个回答

3
假设您只是谈论“参考”数据(类别、产品等)的CRUD操作,则应该有1个服务,其中包含许多GetAllXXX方法或多个服务,最终从基础服务继承。实际上并不重要,因为如果您有许多DTO需要传输,您将得到许多GetXXX方法。
只需注意以下两点:
- WCF服务中方法数量越高,“热身”时间就越长(这个问题大约在100-200个方法时会出现) - 无法在WCF中公开未定义通用参数的“通用”方法
例如:
public class DataService<TIn>
{
    protected List<TOut> GetAll<TOut>()
    {
         // handle generic loading and transformation here
    }
}

public class CategoryService : DataService<Category>
{
    public List<CategoryDTO> GetAllCategories()
    {
        return GetAll<CategoryDTO>();
    }
}

或者

public class DataService
{
    protected List<TOut> GetAll<TIn, TOut>()
    {
         // handle generic loading and transformation here
    }

    public List<CategoryDTO> GetAllCategories()
    {
        return GetAll<Category, CategoryDTO>();
    }
}

然后在通用方法内,您可以使用Automapper从Category映射到CategoryDto。

最后,对于更多面向用户/业务的服务,您应该有针对每个“View”中要呈现的数据的DTO。

(1)是的,它非常符合面向对象编程的思路。但是您倾向于通过从大型数据库生成代码来解决这些问题 :)


3

以上解决方案有没有好的替代方案?

是的,您可以使用RESTful服务。我也建议不要使用fat interfaces(mathieu solution)。Fat interfaces难以维护、重构,它们笨重而沉重。如果您选择REST,您可以拥有这样的API(在WCF中可以拥有类似的接口):

有没有适用于WCF服务的“通用”方法来处理这种情况?

是的,您可以在服务器上使用泛型,但对客户端而言,这将显示为具体类型。请参见this post以获取示例。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接