2011-10-12 33 views
4

嗨,我想創建一個基類繼承,但我有一些問題。C#泛型遺傳數據訪問

我有兩個類裏面做幾乎相同的工作,但讓他們從不同的數據庫,並使用不同的內部數據結構來處理數據的數據。 我想在基地也基本虛擬DoSomething的方法和理想的虛擬數據訪問方法。

第二個問題可以通過使用泛型來解決,但我不能使用泛型作爲我使用DBML上下文的構造是不參於解決第一個問題。

我要對這個完全錯誤的。我正在嘗試幹,但似乎是在反對繼承。

下面的示例代碼。

class Foo { 
private _ctx DBML.Database1; // Inherits from System.Data.Linq.DataContext 

public Foo(string constring) { 
    _ctx = new DBML.Database1(constring); 
} 

private DoSomeThing() { 

    FooDataObj = DataAccess(1); 
} 

private FooDataObj DataAccess(int ID) 
{ 
    var v = from t in _ctx 
      where t.Id = ID 
      select new FooDataObj(t); 

    return v 
} 
} 

class Bar { 
private _ctx DBML.Database2; // Inherits from System.Data.Linq.DataContext 

public Bar(string constring) 
{ 
    _ctx = new DBML.Database2(constring); 
} 

private DoSomeThing() { 

    BarDataObj = DataAccess(1); 
} 

private BarDataObj DataAccess(int ID) { 
    var v = from t in _ctx 
      where t.Id = ID 
      select new BarDataObj(t); 

    return v 
} 
} 
+0

你似乎需要一個工廠來創建上下文與創建一個共同的接口/基類。 – CodingBarfield

+0

實際上你正在試圖完成什麼? –

回答

2

FooBar不應自行調用數據庫構造方法,該數據庫對象應該是構造(而不是連接字符串)的參數。這個原則被稱爲依賴注入,並將解決你的大部分問題。應該很容易,然後創建一個新的泛型類DataObjFactory<DataObjType>作爲Foo和Bar的替代品。

0

你應該把它封裝了你想分享功能的基類。在這種情況下,如果您在實體對象上使用接口,則可以重用數據訪問代碼。事情是這樣的:

interface IUniqueEntity 
{ 
    int ID { get; } 
} 

abstract class FooBarBase<TEntity> 
    where TEntity : class, IUniqueEntity 
{ 
    private DataContext _ctx; 

    public Foo(DataContext context) { 
     _ctx = context; 
    } 

    protected abstract DoSomeThing(); 

    protected TEntity DataAccess(int ID) 
    { 
     return _ctx.GetTable<TEntity>() 
     .First(e => object.Equals(e.ID, ID); 
    } 
} 

然後你可以從FooBarBase的IUniqueEntity接口適用於您的Foo/BarDataObj,並繼承你美孚/酒吧類:

class Foo : FooBarBase<FooDataObj> { 
    public Foo(DBML.Database1 context) : base(context) { 
    } 

    protected override DoSomeThing() { 
     var myobj = DataAccess(1); 
    } 
}