2009-08-29 2 views
0

인터페이스에 모델 클래스를 다시 고려 중입니다. 모델 클래스는 Linq-to-SQL을 사용하여 자동 생성됩니다.디커플링을 위해 Linq-to-SQL과 인터페이스 사용

class FooRepository 
{ 
    // ... 
    public void Add(IFoo foo) 
    { 
     db.Foos.InsertOnSubmit(foo);  
    } 
} 

InsertOnSubmit 메서드는 IFoo가 아닌 Foo의 인스턴스를 사용합니다. 인스턴스를 인라인으로 (Foo)로 캐스팅 할 수 있지만이 방법이 더 효과적입니다.

이미 StructureMap을 사용하고 있습니다. Add 메서드에 특성을 추가하여 매핑을 기반으로 형식을 확인할 수 있습니까?

또는 모델 클래스 메서드 중 하나를 재정의하거나 부분 이벤트를 사용하여이를 수행 할 수 있습니까?

답변

1

DLINQ 모델을 컨트롤러에서 분리하기 위해 LINQ 모델을 전달하지 않지만 컨트롤러에서 사용하는 다른 모델을 사용하는 경우 DLINQ 메서드를 호출하기 전에 클래스에 전달됩니다.

데이터베이스에서 사용할 수있는 다른 많은 속성이있을 수 있지만이 방법으로 응용 프로그램에 필요한 속성 만 내 컨트롤러에 가질 수 있습니다.

이렇게하면 데이터베이스 구조가 FooRepository와 같은 DAO 클래스 만 변경해야하는 경우 변경해야하며 나머지는 파급 효과로부터 보호됩니다.

내가 이와 같은 일을하고 싶다면 잘 모르지만 예상 한 인터페이스를 사용하는 것보다 단순한 디자인이 될 것입니다.

+0

내 컨트롤러는 모델 인터페이스를 사용하여 ViewModel 개체로 변환합니다. 데이터 액세스/저장소 영역을 제외하고는 LINQ 모델을 사용하지 말고 다른 클래스에 매핑한다는 내용을 듣습니다. 인터페이스를 사용하면 한 영역에서 변경을 관리하고 다른 영역에 영향을주지 않으면 서 많은 유연성을 얻을 수있었습니다. – blu

+0

+1하지만 나쁜 대답이 아니기 때문에 지금 당장은 내가 찾고있는 것이 아닙니다. – blu

+0

인터페이스의 속성을 정의하고 클래스의 속성을 정의 할 때 이상적인 클래스의 클래스가 과도 할 수있는 인터페이스를 사용하는 것 같습니다. 나는 사용하는 경향이있다 클래스 사용자 { public String Name {get; 세트; } } 인터페이스의 클래스가 인터페이스와 동일합니다. –

0

Dunno는 적합하지만 genics를 사용하는 것이 좋습니다.

class FooRepository<T> 
where T: class, IFoo, new() 
{ 
    // ... 
    public void Add(T foo) 
    { 
     db.Foos.InsertOnSubmit(foo);  
    } 
} 

그리고 당신은 이런 식으로 뭔가 할 수 -

Foo bar = new Foo(); 
FooRepository<Foo> foo = new FooRepository<Foo>(); 
bar.Add(bar); 

또는이 ...

Bar bar = new Bar(); //Bar implements IFoo 
FooRepository<Bar> foo = new FooRepository<Bar>(); 
bar.Add(bar); 

, FooRepository에서 T 실제로 푸 (또는 바)는 그 방법을, IFoo가 아니기 때문에 캐스팅은 필요하지 않지만 where 절의 제한은 Foo (및 Bar)가 수행하는 IFoo를 구현해야 함을 의미합니다.

관련 문제