我知道,問題很長,可能很難理解,但希望有人點擊它,現在我可以更詳細地解釋我的問題。如何有效地設計創建/更新方法,需要創建/更新不同類型的屬性?
我有一個Create方法用於創建一個名爲'opportunity'的對象。一個機會有許多不同的屬性需要設置,但爲了簡單起見,我將使用'標題','位置'和'StartDate'。
我也有一個Update方法,它做了一些非常相似的事情,關於列出的屬性,它將以相同的方式設置它們。然而,作爲一個方面說明,我需要2個不同的方法,因爲它們有所不同。
這兩種方法都將另一個名爲'Entity'的對象作爲參數,用於設置'opportunity'的值。
所以,現在我的問題。我認爲最好的方法是使用1個方法來完成所有屬性設置,這兩種方法都使用該方法。我會傳遞一個元組列表給這個方法,它包含1)要設置的機會屬性名稱,以及2)要設置的實體屬性值。然而,要做到這一點,我想可能需要像字符串,對象這樣的元組,因爲實體屬性值可能是5種類型中的1種。據推測這會導致拳擊(因此是昂貴的)。除了這一點,我將使用的類型來決定如何更新給定的機會屬性,所以是這樣的:
if (PropType == typeof(string))
{
//Do something
}
else if (PropType == typeof(Picklist))
{
//Do something else
}
else if (PropType == typeof(DateTime))
{
//Do something else
}
我的問題是,這是做的一個有效的方法?它背後的兩個主要原因是,它似乎有很多重複的代碼之間的創建方法和更新方法,以及在每個方法中的事情,如if(entity.prop.value!= null)opp.prop .value = entity.prop.value。第二個原因是這種方式更容易進行單元測試。我可以爲要設置的每個機會屬性創建一個測試,並將其作爲元組列表傳遞給我的新方法,並在正確創建/更新後返回。
我考慮了一個KeyValuePairs的列表,但我可能需要向列表中添加額外的信息位,所以用tuple去了。另外,我認爲元組傳遞給其他方法的成本較低(儘管分配成本更高)。
我敢肯定,儘管我盡了最大的努力,這仍然不清楚,所以有任何問題,請問。
編輯
爲了讓更多的清晰,已經有到位的更新方法(雖然我想重寫它的),有很多相同的代碼在其設定的機會屬性如下:
if(entity.Title.Value != null) opp.name = entity.Title.Value;
else throw new Exception("Title not specified");
if(entity.Town.Value != null) opp.town = entity.Town.Value;
else throw new Exception("Town not specified");
這是爲所有字符串屬性完成的。我現在的觀點是,我不認爲我應該需要複製這個對所有屬性,而是有一些,說:
//newOpp is passed in as the new opportunity
//Fields refers to a tuple passed in as object, string
//Item1 = entity field value
//Item2 = newOpp property name
PropertyInfo[] OppProps = newOpp.GetType().GetProperties();
PropertyInfo prop;
foreach (var record in Fields)
{
prop = OppProps.FirstOrDefault(x => x.Name == record.Item2);
if(record.Item1 != null && prop != null)
{
Type PropType = prop.GetType();
if (PropType == typeof(string))
{
prop.SetValue(newOpp, record.Item1, null);
}
//Extend to include other types used e.g. DateTime etc.
}
}
請您詳細說明SHORT嗎? – 2014-10-08 12:49:58
@SHEKHARSHETE - 好吧,2種方法非常相似,不想重複代碼,並希望能夠輕鬆進行單元測試。在我的問題是我目前的想法和問題。這是做這件事的好方法嗎? – sr28 2014-10-08 12:52:42
爲什麼不傳遞包含新值的dto/entity/poco,然後使用automapper將它們映射到Opportunity對象,或者使用方法手動映射它們到Opportunity對象? – Kristof 2014-10-08 12:55:07