2012-09-22 3 views
0

나는 지난 2 주에서이 WPF로입니다. 현재 MVVM 패턴을 기반으로 wpf 응용 프로그램을 개발 중입니다. Visual C# 2010에서 내 솔루션 안에 2 개의 프로젝트가 있습니다. 하나는 WPF 응용 프로그램 (MSPBoardControl을 말하게 함)이고 다른 하나는 클래스 라이브러리입니다 (ConnectViewComponent라고 말하면됩니다). 따라서 MSPBoardControl과 ConnectViewComponent는 각각 view, viewmodel, model 클래스를 갖습니다.에 액세스하는 방법을 WPF 응용 프로그램 및 ClassLibrary의 회원들과 그 반대의 경우도 마찬가지

내 MSPBoardControl에 ConnectViewComponent 참조를 추가했으며 내 MSPBoardControl의 View, Viewmodel 및 모델 클래스에서 ConnectViewComponent의 멤버 변수에 액세스 할 수 있습니다. 내 관심사는 내 ConnectViewComponent에서 MSPBoardControl의 멤버 변수에 액세스하는 방법입니다. MSPBoardControl의

뷰 모델 :

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.ComponentModel; 
using ConnectViewComponent.Model; 
using System.Windows.Input; 
using ConnectViewComponent.Commands; 
[[[using MSPBoardControl.ViewModel;]]] 

namespace ConnectViewComponent.ViewModel 
{ 
public class ConnectViewModel : INotifyPropertyChanged 
{ 
    public List<ConnectModel> m_BoardNames; 
    [[[BoardControlViewModel mBoardVM;]]] 

    public ConnectViewModel() 
    { 
     m_BoardNames = new List<ConnectModel>() 
     {     
      new ConnectModel() {Name = "Bavaria", Connection_Status = "Disconnected"}, 
      new ConnectModel() {Name = "Redhook", Connection_Status = "Disconnected"},     
     }; 
    } 

    public List<ConnectModel> BoardNames 
    { 
     //get set 
    } 

    private ConnectModel m_SelectedBoardItem; 
    public ConnectModel SelectedBoard 
    { 
     //get set 
    } 

    private ICommand mUpdater; 
    public ICommand ConnectCommand 
    { 
     get 
     { 
      if (mUpdater == null) 
       mUpdater = new DelegateCommand(new Action(SaveExecuted), new Func<bool>(SaveCanExecute)); 

      return mUpdater; 
     } 
     set 
     { 
      mUpdater = value; 
     } 
    } 

    public bool SaveCanExecute() 
    { 
     return true; 
    } 

    public void SaveExecuted() 
    { 
     if (SelectedBoard.Connection_Status == "Disconnected" && SelectedBoard.Name == "Bavaria") 
     { 
      SelectedBoard.Connection_Status = "Connected";     
     } 

     else if (SelectedBoard.Connection_Status == "Disconnected" && SelectedBoard.Name == "Redhook") 
     { 
      SelectedBoard.Connection_Status = "Connected";    
     } 
    } 
} 
} 

[[[-]]] 내 코드는 내가 너무 Namespace.ViewModel을 사용뿐만 아니라 BoardControlViewModel의 멤버에 액세스 할 수 없습니다입니다 의미에서. 이 순환 종속성으로 이어질 것이기 때문에

내 ConnectComponent 프로젝트에 BoardControl의 참조를 추가 할 수 없습니다. 어떻게 접근 할 수 있습니까? 도와주세요!!

답변

2

갖는 원형의 의존성은 "코드 냄새"가 될 수 있습니다. 이 "냄새"를 제거하는 다양한 방법이 있습니다. 간단하게하기 위해 원형 의존성을 갖는 프로젝트 A와 프로젝트 B가 있다고 가정 해 보겠습니다. 새 프로젝트 C.하자 A와 B 참조 C.에 두 프로젝트에서 사용하고이를 이동 일반적인 유형 밖으로

  1. 요인이 A와 B에서 종속성 또는 반대 의존성 또는 모두 종속성 중 하나를 제거해야합니다 .

  2. A 및 B는 추상화 공통으로 상호 작용이 분리해야 할 필요 작용 유형 (예를 들면 인터페이스 또는 추상베이스 클래스)가있는 경우. 그런 다음 A와 B가 모두 참조하는 프로젝트 C로 구현하지 않고 이러한 유형을 이동해야합니다. 이렇게하면 A와 B의 유형이 상호 작용할 수 있지만 C의 정의 만 사용할 수 있습니다. 예를 들어 A가 기본 응용 프로그램 일 수 있습니다. 그것은 C로 정의 된 IService 인터페이스를 호출하지만 B로 구현되고 C에서 IService을 통해 정의 된 콜백 IServiceCallback을 등록합니다. B는 구현이 A에 있음을 모른 채 IServiceCallback을 사용하여 A로 다시 호출 할 수 있습니다.

  3. A와 B의 유형이 강하게 결합되면 A와 B를 단일 프로젝트로 병합해야합니다.

+0

설명해 주셔서 감사합니다. 커플 링을 보면, 나는 shud가 하나의 프로젝트에 A & B를 병합한다고 생각합니다 :) –

1

당신은 그 일반적인 클래스를 포함합니다 "일반적인"라이브러리 (프로젝트)의 몇 가지 유형을 추가 할 수 있습니다. 따라서 BoardControl과 ConnectComponent 모두이를 참조 할 수 있습니다.

또한 당신은 similar question를 확인할 수 있습니다. 프로젝트의

+0

두 프로젝트의 Viewmodel 클래스에만 액세스해야합니다. A의 뷰 모델과 B의 VM을 비교하고 그 반대의 경우도 마찬가지입니다. 그들은 서로에 의존하고 있습니다 :) –

관련 문제