2009-08-17 2 views
0

클래스 클래스가 있습니다. 각 클래스는 몇 가지 엔티티를 나타내며 기본 정적 메소드 인 Add, Get, Update 및 Delete를 포함합니다.일부 엔티티에 대해 동일한 기능을 갖는 메소드를 개발하는 방법은 무엇입니까?

이 메소드는 객체를 인스턴스화하지 않고 일부 동작을 수행 할 수 있기 때문에 정적으로 만들었습니다. 예 : 일부 객체를 추가하려면이 작업을 수행해야합니다. Foo.Add (foo).

이제 모든 클래스에 대해 다른 프레임 워크에서 호출 할 수있는 메소드가 필요합니다. 하지만이 방법의 기능은 동일합니다 : 예를 들어, 나는 개체가 있는지 확인하고 싶지 않은 경우 - 만들거나 그렇지 않으면 - 업데이트하고 싶습니다.

구현 방법은 무엇입니까? (아이디어에 따라 한 곳에서 모든 코드를 가지고)

public void DoSomethingWithFoo(Foo foo) 
{ 
    if (Foo.Get(foo.id) != null) 
     Foo.Update(foo); 
    else 
     Foo.Add(foo); 
} 

public void DoSomethingWithBar(Bar bar) 
{ 
    if (Bar.Get(bar.id) != null) 
     Bar.Update(bar); 
    else 
     Bar.Add(bar); 
} 

또는 더 나은이 InvokeMember에를 사용하는 것입니다 :

예 :

내가 모든 클래스에 대해이 방법으로 그것을해야 ?

예컨대 :

public void DoSomethingWithFoo(Foo foo) 
    { 
     DoSomethingWithObject(foo); 
    } 

    private void DoSomethingWithObject(object obj) 
    { 
     Type type = obj.GetType(); 

     object[] args = {type.GetProperty("ID").GetValue(obj, null)}; 
     object[] args2 = { obj }; 
     if (type.InvokeMember("Get", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, args) != null) 
     { 
      type.InvokeMember("Update", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, args2); 
     } 
     else 
     { 
      type.InvokeMember("Add", BindingFlags.Default | BindingFlags.InvokeMethod, null, null, args2); 
     } 
    } 

어떤 방식이보다 효율적이고 청소기입니까? 아니면 다른 접근법을 제안 할 것인가?

감사합니다.

답변

0

음.

나는 먼저 자신의 엔티티 프레임 워크를 작성하지 말고 LLBLGen과 같은 것을 사용한다고 말합니다.

둘째 나는 당신이 조언을 무시한다면, 당신은

public abstract class SavableBase 
{ 
    protected abstract void Add(); 
    protected abstract void Update(); 

    public void Save() 
    { 
    if(!saved){ 
     Add(); 
    } else { 
     Update(); 
    } 
    } 
} 

같은 일부 슈퍼 클래스를 원하는 그리고 적절하게 그 방법을 구현 말할 것입니다.

+0

사실 나는 이미이 목적을 위해 NHibernate를 사용하고 있습니다. 하지만 문제는 기본 프레임 워크에있는 객체에 액세스하는 메소드 (앞에서 설명한 기능과 동일한 기능을 가짐)를 구성하는 방법입니다. 그래서 우리는 다른 라이브러리의 프레임 워크에서 객체에 액세스하고 있습니다. –

+0

오른쪽. 글쎄, 나는 그것을 묘사했다. –

관련 문제