2011-07-13 43 views
0

我不知道是否可以做。我有两个类:从基础班的儿童班的访问

public class Document 
    { 
    public uint location; 

    public Document(uint documentId) 
    { 
     // Here complex logic of retrieving information from DB follows 
     OracleCommand documentCommand = new OracleCommand("select field1, field2, field3 from table(usr.common_pck.GetDocument(:pDocumentId))", conn); 
     documentCommand.Parameters.Add("pDocumentId", documentId); 
     OracleDataReader documentReader = documentCommand.ExecuteReader(); 
     if (documentReader.HasRows) 
     { 
      this.id = documentId; 
      this.serial = documentReader.GetString("field2"); 
      this.location = Convert.ToUInt32(documentReader.GetInt32("field1"));  
      // Here I want to call "manualSetLocationStr(field3)" of DocumentViewModel 
     } 
    } 
} 

在这里,第二类:

 public class DocumentViewModel : Document { 
      private OracleConnection connection; 
      private string _locationStr { get; set; } 

      protected void manualSetLocationStr(string value) 
      { 
       _locationStr = value; 
      } 

      public string typeStr { get { return ((Dictionary<int, string>)HttpContext.Current.Application["DocumentTypesList"]).Single(mbox => mbox.Key == type).Value; } } 

public string locationStr { 
       get { 
        if (_locationStr == null) { 
         OracleCommand getNameCommand = new OracleCommand("select usr.common_pck.GetName(:id) as name from dual", connection); 
         getNameCommand.Parameters.Add("id", this.location); 
         OracleDataReader NameReader = getNameCommand.ExecuteReader(); 
         NameReader.Read(); 
         _locationStr = NameReader.GetString("name"); 
        } 
        return _locationStr; 
       } 
      }  
     } 

所以我的问题是我怎么能叫manualSetLocationStr()在文档的构造器?我需要这样做以避免从locationStr获取访问者的数据库中检索信息,因为我已经拥有了它(这是文档构造器中的field3)。 任何建议,任何虽然将非常感激。 非常希望你的帮助! 在此先感谢!

回答

1

为什么field3值不能作为Document的属性存储?而且,对于视图模型来说,包含模型实例更为标准,而不是从它们派生出来。

更新

这取决于你的架构,但你可以创建一个DocumentInfo类型例如它拥有所有你需要查看的属性。然后,您需要为您的视图填充这些集合,您可以使用提供数据访问抽象的DocumentInfoRepository。该存储库可以直接在您的实体或您的控制器中访问,具体取决于您的域模型的类型和您希望使用的模式。

+0

“文档”类不仅适用于视图。它由另一个应用程序使用。所以我不想用这个渲染视图所需的其他东西来混淆这个实体。实际上'field3'是'field2'的字符串表示。所以'field2'是'field3'的关键。这就像'KeyValuePair'。 – kseen

+0

您将需要创建一个新类型,然后专门为该视图提供这个附加属性,并且根本不使用文档检索代码。 – devdigital

+0

谢谢@devdigital!你能举个例子吗? – kseen

0

看到您对视图模型类的OracleConnection属性如何 - 它看起来似乎是错误的。假设你已经创建了DocumentViewModel类,我强烈要求你将它填充到控制器中,并从中省略OracleCOnnection。您可以使用AutoMapper来代替从Document继承,而不是从Document继承。这涉及两个简单的步骤:

你这样做每个应用程序启动一次:

AutoMapper.Mapper.CreateMap<Document, DocumentViewModel>(); 

然后在控制器使用它:

var viewModel = AutoMapper.Mapper.Map<Document, DocumentViewModel>(documentInstance); 

这将创建DocumentViewModel的实例,并尽可能多的地图属性,因为它可以。通过这样做,您可以避免从Document类继承。

至于你的视图模型的结构。而不是有一个方法typeStr,有一个属性TypeStr在控制器操作中自动映射后设置。你的typeStr方法也一样。

视图模型的整体思想是为UI提供一个愚蠢的数据呈现的可能表示。所以理想情况下,没有方法调用,没有延迟加载(应该预加载)。

您还可以使用AutoMapper您发布的视图模型映射回文档实例在POST方法,像这样:

添加反向映射到应用程序启动:

AutoMapper.Mapper.CreateMap<DocumentViewModel, Document>(); 

并在控制器:

[HttpPost] 
public ActionResult Edit(DocumentViewModel viewModel) 
{ 
    var document = AutoMapper.Mapper.Map<DocumentViewModel, Document>(viewModel); 
} 

希望这会有所帮助。

编辑:回答你的问题。您可以在自动映射之前调用Document实例上的manualSetLocationStr()以查看模型。

+0

实际上viewmodel类中没有连接字段。这只是例如。 – kseen

+0

关于AutoMapper的性能,你可以说些什么?因为我的项目似乎非常庞大,所以最好只使用原生的东西来解决这个问题。 – kseen

+0

请问您可以提供一些关于您的问题编辑的例子吗?非常感谢您的帮助。 – kseen