2017-10-28 70 views
-1

我想爲數據訪問層一個接口,並實現它的各種數據庫(即MongoDB中,SQL服務器等)如何擁有一個通用的接口?

public interface IDataAccess 
{ 
    Task InsertEntityAsync<T>(string collectionName, T entity) where T : IData; 
    // the rest 
} 

和一個特定的數據庫:

public class MongoDbDataAccess : IDataAccess 
{ 
    public Task InsertEntityAsync<T>(string collectionName, T entity) where T : IData 
    { 
     throw new NotImplementedException(); 
    } 
} 

我可以例如,使T代替StudentEntity,然後在InsertEntityAsync()方法內將其轉換爲該特定數據庫接受的類型。

但我希望我的方法是通用的,所以如果我通過StudentEntity,該方法將其轉換爲StudentDocument第一,然後將其保存在數據庫中,如果我通過UniversityEntity,該方法將其轉換爲UniversityDocument然後保存它,你會得到理念。

如何有一個通用的方法將數據庫中的每個數據轉換爲相應的接受類型?

+0

您的接口的意圖是爲您可能使用的每個可能的數據庫框架,或者您可能在給定數據庫上使用的每種實體類型提供接口嗎? –

+0

@ChrisThompson他們倆都是 – Blendester

+0

我不是很瞭解downvotes。這太寬泛了怎麼樣?! – Blendester

回答

0

看來,最直接的方式做,這是對每種類型的實體的轉換信息,例如每類裏面的靜態Dictionary<TKey, TValue>

public class StudentEntity : IData 
{ 
    public static Dictionary<FieldInfo, string> ConversionInfo = new Dictionary<FieldInfo, string> 
    { 
    {fieldinfo1, "database column name 1"}, 
    {fieldinfo2, "database column name 2"}, 
    ... 
    } 
    ... 
} 

在那裏你可以Type.GetField()字段信息獲取。

在進行轉換時,您應該遍歷此字典以獲取需要考慮的所有字段。

我應該警告你,挖掘到System.Reflection(處理元編程類行爲和在運行時分析類型的C#/ .NET中的命名空間)可以非常快速地變得非常難看,所以儘量保持它最低限度你需要得到這些領域。

請注意,這是關於如何使用這種技術的粗略的基本描述,您需要根據它如何適合您的實際代碼找出確切的細節。