2010-10-21 65 views
1

我創建了一個類,其中主要任務是從數據庫獲取數據並將其映射到某個對象。問題是同一類需要將不同的數據讀取器映射到不同的對象。所以,我試圖做的是走出使用委託的映射方法。委託 - 我的代表是否正確?

這是我的代碼的一部分。以粗體顯示重要行。

public class GetDetails<T> 
{  
    **public delegate void DelegateMapping(T position, IDataReader reader);** 
    **public DelegateMapping mappingMethod;** 

    public T Get(T instance) 
    { 
     //Get IDs and Add to list 
     _db.ExecuteReader(storedProcedure.ToString(), CommandType.StoredProcedure, reader => 
     { 
      while (reader.Read()) 
      { 
       **mappingMethod(instance, reader);** 
      } 

     }, parameterList.ToArray()); 

     return instance; 
    } 
} 

這是被調用和使用「GetDetails」類

public class PositionDB : DbBase 
{ 
    public Position GetPositionDetails(string IDs) 
    { 
     GetDetails<Position> getIDs = new GetDetails<Position>(base.db); 
     getIDs.storedProcedure = StoredProcedure.NET_ADM_GetPositionDetails; 

     //Set the Delegated Method 
     **getIDs.mappingMethod = MappingPositionDetails;** 

     //Set Parameters 
     getIDs.parameterList.AddInParam("PositionIds", DbType.String, IDs); 

     //Return the PositionId Collection 
     return getIDs.Get(new Position()); 
    } 

    **private void MappingPositionDetails(Position position, IDataReader reader) 
    { 
     position.Id = reader["CompPositionId"]; 
     position.Description = reader["Description"]; 
     position.ExpirationDate = reader["ExpirationDate"]; 
     position.Title = reader["Title"]; 
    }** 

} 

的代碼工作正常類。

的questios是:

  1. 我有沒有正確使用委託?
  2. 這種解決方案可能會在未來造成問題(性能)?
  3. 還有另一個更好的解決方案?

非常感謝您

塞巴斯蒂安

回答

1

具體回答你的問題:

  1. 是的,你沒有使用委託正確
  2. 是的,它可能會導致因併發問題多線程問題
  3. 我想是這樣的,我下面詳述

一個可能的解決方案,我會提出三個轉變:

  1. 移動則委託調用進入方法(併發問題,一個線程可能會改變,而另一種映射代表線程嘗試訪問它,現在試圖將閱讀器映射到完全不同於所提供的對象)
  2. 使用已經存在的通用Action/Func委託,不需要定義您自己的。
  3. 使用lambda表達式定義額外的方法
  4. 映射,無需

注意:2和3至少需要.NET 3.5。

用人這兩個方案,你的代碼應該是這樣的:

public class GetDetails<T> 
{  
    public T Get (T instance, Action<T, IDataReader> mappingMethod) 
    { 
     //Get IDs and Add to list 
     _db.ExecuteReader(storedProcedure.ToString(), CommandType.StoredProcedure, reader => 
     { 
      while (reader.Read()) 
      { 
       mappingMethod(instance, reader); 
      } 

     }, parameterList.ToArray()); 

     return instance; 
    } 
} 

現在你可以在多線程環境中使用此方法爲好。

編輯

才意識到它只是部分的代碼。我糾正了我的建議,將其考慮在內。

0
  1. 是(這裏也有一些改進,你可以做,見3)
  2. 不是性能明智的,在可發現也許有些問題。
  3. 我會使用多態性來完全消除代理完成的discoerability。也許使用抽象方法/類。同樣取決於您爲您開發的.NET版本可以使用lambdas和更簡單的類型。

public Action<Position, IDataReader> Mapping { get; set; }

然後

getIDs.Mapping = (position, reader) => 
    { 
     position.Id = reader["CompPositionId"]; 
     position.Description = reader["Description"]; 
     position.ExpirationDate = reader["ExpirationDate"]; 
     position.Title = reader["Title"]; 
    }; 
相關問題