2011-10-12 3 views
4

안녕하세요 저는 상속받을 기본 클래스를 만들고 싶지만 몇 가지 문제가 있습니다.C# Generics 상속 데이터 액세스

나는 거의 동일한 작업을 수행하지만 서로 다른 데이터베이스에서 작업하는 데이터를 얻고 다른 내부 데이터 구조를 사용하여 데이터를 조작합니다. 나는 가상의 doSomething 메서드를 기본에두고 가상적으로 이상적인 가상 데이터 액세스 메서드를 기본으로 갖고 싶습니다.

두 번째 문제는 generics를 사용하여 해결할 수 있지만 사용하는 DBMl 컨텍스트의 생성자가 매개 변수가 아니기 때문에 첫 번째 문제를 해결하기 위해 generics를 사용할 수 없습니다.

나는이 모든 잘못에 대해 생각하고 있습니다. 나는 건방진이 되려고하지만 상속에 반하는 것처럼 보입니다.

아래의 예제 코드.

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 스스로 데이터베이스 생성자를 호출해서는 안, 데이터베이스 객체는 생성자 (대신 연결 문자열)의 매개 변수이어야한다. 이 원칙을 의존성 주입 (Dependency Injection)이라고하며, 대부분의 문제를 해결합니다. Foo와 Bar를 대신하여 새로운 일반 클래스 DataObjFactory<DataObjType>을 만드는 것이 쉬워야합니다.

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에서 푸/BarDataObj에 IUniqueEntity 인터페이스를 적용하고 푸/바 클래스를 상속 할 수 있습니다 :

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

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