2013-07-03 43 views
0

我想知道:mapper抽象有多复杂?映射器从数据库获取数据不好吗?

比方说,我有一个控制器的动作

ActionResult Find(QueryInputModel query) 

与模型看起来像这样

class QueryInputModel 
{ 
    public string Text {get;set;} 
    public IEnumerable<string> RegionCodes {get;set;} 
} 

除其他事项外,它的行动的责任,把输入模型到视图模型

class QueryViewModel 
{ 
    public string Text {get;set;} 
    public IEnumerable<Region> Regions {get;set;} 
} 

class Region 
{ 
    public string Name {get;set;} 
    public string Code {get;set;} 
} 

查看模型中的区域名称应该从数据库中获取输入模型中的代码。 现在它是由QueryMapper.Map(src)方法,它看起来像这样

public QueryViewModel Map(QueryInputModel source) 
{ 
    var regions = regionRepository.Get(source.RegionCodes); 
    var result = new QueryViewModel {Text=source.Text, Regions=regions}; 
} 

是否正确调用这样一个抽象一个映射做了什么?在单一方法中混合使用直接映射和db查询是否可行?

+1

你对此有所怀疑是件好事。但是,如果你有疑问,你不需要我们的“前进”来改变它。只要将它改变成让你感觉更清洁的东西。 –

回答

-1

您在ViewModel和DataModel之间的映射是手动映射,尝试使用一些有利于映射第三方(如Automapper或Valueinjecter),两者都可以通过Nuget安装到您的项目文件。个人更喜欢Valueinjecter,因为它更容易编码和理解。

1

嗯,这是我的承担。从你所说的话,你有一个用例“查找区域代码的区域详细信息”。此用例有两个输入端口和一个输出端口:

  • 用户输入查询的方式是一个输入端口。
  • 从区域代码到区域细节的DB映射是另一个输入端口。
  • 将结果返回给用户的方法是输出端口。

您在Map函数中实现的所有逻辑都是您的用例逻辑。该功能应该看起来像这样。

public void FindRegionDetailsFromRegionCodes(IUserQuery userQuery, 
              IRegionMapper regionMapper, 
              IUserDisplay userResult) { 
    var regions = regionMapper.Get(userQuery.RegionCodes); 
    userResult.ShowResult(regions); 
} 

有了:

interface IUserQuery { 
    IEnumerable<string> RegionCodes { get; } 
} 

interface IRegionMapper { 
    IEnumerable<Region> Get(IEnumerable<string> regionCodes); 
} 

interface IUserDisplay { 
    void ShowResult(IEnumerable<Region> regions); 
} 

这种方式,用例代码只关注行为的执行的逻辑,以及如何每个东西都做了不细节。您可以通过TCP网络端口(通过适当实施IUserQueryIUserDisplay)公开您的服务,或者通过抛出一对D20并查找C:\和繁殖仓鼠(通过适当执行IRegionMapper)的随机文件来计算详细信息。

现在,事实是,你正在控制器操作中公开这个用例?好。因此,你的控制器动作可以通过将其称之为FindRegionDetailsFromRegionCodes

  • QueryInputModel,实施IUserQuery
  • QueryViewModel,实施IUserDisplay
  • RegionRepository(我想这是类的名称),实施IRegionMapper

Text从输入复制到视图不是您的用例关注点。这应该通过你的行动来完成。 (作为我的论文的支持论据,如果您在某些时候复制另一个字段,则不应更改用例代码)

希望这有助于您。要回答你的问题,真正的映射发生在DB中,这就是为什么我只称之为“DB”端口IRegionMapper