2016-09-19 1 views
-3

학습 MVVM와 나는 실행하는 기본 샘플을 생각MVVM - SQL 연결은 어디에 있습니까?

의이 업데이트 SQL 직접
링크에서이 link

참조 가정 해 봅시다 :
나는 가정 모델 (비즈니스 규칙, 데이터 액세스 모델 클래스를) 데이터 액세스에는 SQL이 포함됩니다

그러나 해당 링크에서 데이터 액세스는 ViewModel
에 있습니다. 맞습니까?
설명해주세요
모델이 비즈니스 엔티티입니까?

public class CreateEmployeeViewModel : INotifyPropertyChanged 
    { 
    private string _id; 
    private string _firstName; 
    private string _address; 
    public CreateEmployeeViewModel() 
    { 
     SaveCommand = new DelegateCommand(Save,() => CanSave);   
    } 

    public string ID 
    { 
     get { return _id; } 
     set 
     { 
      _id = value; 
      NotifyOfPropertyChange("ID"); 
     } 
    } 
    public string FirstName 
    { 
     get { return _firstName; } 
     set 
     { 
      _firstName = value; 
      NotifyOfPropertyChange("FirstName"); 
     } 
    } 
    public string Address 
    { 
     get { return _address; } 
     set 
     { 
      _address = value; 
      NotifyOfPropertyChange("Address"); 
     } 
    } 
    public ICommand SaveCommand { get; private set; } 

    public bool CanSave 
    { 
     get { return !string.IsNullOrEmpty(ID) && !string.IsNullOrEmpty(FirstName); } 
    } 
    string connectionString = 
     @"Data Source=RAVINDRA\MSSQLSERVERS;Initial Catalog=CrudMethod;Integrated Security=SSPI;"; 
    public void Save() 
    {   
     SqlConnection con = new SqlConnection(connectionString); 
     SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandText = "INSERT INTO Users(ID,FirstName,Address)VALUES(@ID,@FirstName,@Address)"; 
     cmd.Parameters.AddWithValue("@ID", ID); 
     cmd.Parameters.AddWithValue("@FirstName", FirstName); 
     cmd.Parameters.AddWithValue("@Address", Address); 
     try 
     { 
      con.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
     catch (SqlException ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      con.Close(); 
     } 
     MessageBox.Show("Data Saved Successfully."); 
    } 
+0

Entity Framework (youtube search : kudvenkat)를 배우거나 데이터 액세스 레이어 만 만들어야합니다.보기 모델은 비즈니스 로직 레이어와 같습니다. –

+0

@PamingkasSevada EF는 대상 응용 프로그램과 관련이 없습니다. 2 억 개가 넘는 행의 테이블과 200 개 이상의 매우 맞춤식 쿼리가 있습니다. 이것은 제가 재 작업 한 WPF입니다. 사용자는 SQL 문과 같은 구문으로 쿼리를 지정할 수 있지만 LINQ에 해당하는 연산자가 없거나 실제 못 생기는 새로운 검색 연산자를 사용하여 조인을 추상화합니다. 존이 suzie로 보낸 이메일이 좋아. 모델은 무엇입니까? 모델은 주로 주로 엔티티 만 정의합니까? – Paparazzi

+0

나는 mvvm과 관련된 논문 프로젝트를 가졌지 만 데이터 액세스 레이어를 사용했습니다. 아무도 당신이 엄격하게 아키텍처를 따랐다면 걱정하지 않아도됩니다. 당신이보기에 코드를 작성하든 말든, 고객이 원하는 것을 제공하는 한. –

답변

1

좋아, 모델을 사용하지 않은 MVVM 만 수행하면됩니다. 나는 당신이 완벽하게 타당한 UX의 첫 번째 접근법으로 당신을 당신에게 개발하기 시작했다고 추정한다. 모든 xaml 바인딩을 활용하기 위해 뷰의 DataContext에있는 일부 클래스보다보기를 만들었습니다. 이러한 클래스는 ViewModels라고 불리게되었습니다.

ViewModel의 책임은 View에서 쉽게 소비 할 수있는 방식으로 데이터와 로직을 노출하는 것입니다. 그것은 당신의 뷰 모델이하고있는 것입니까? 네, 그 이상은 아닙니다.

하지만 다음에 생각해 보겠습니다. 또한 생성 된 직원을 읽고 업데이트하거나 삭제하기를 원할 것입니다. 보기 이외에도 여러 가지 방법으로 액세스 할 수 있습니다. ViewModel에 SQL 문을 계속 작성하면 "반복하지 말 것"원칙에 위배 될 수 있습니다. 예를 들어 모든 SQL 문에서 FirstName, Address와 같은 열 이름을 반복해야합니다. DataAccess 논리 및 유효성 검사를 추출하면 모델이 있습니다.

모델에 포함되지 않은 유효성 검사 (예 : 이름의 최소 길이)를 추가하면 여러 가지보기 모델에서 유효성 검사를 다시 구현해야합니다. 반드시 엔티티 모델이 될하는 뷰 모델이 될 것에서 가장 쉬운 데이터 액세스 및 비즈니스 로직을 추출 :.

public class EmployeeModel 
{ 
    private const string connectionString = 
     @"Data Source=RAVINDRA\MSSQLSERVERS;Initial Catalog=CrudMethod;Integrated Security=SSPI;"; 

    public void CreateEmployee(string ID, string firstName, string address) 
    { 
     if (string.IsNullOrEmpty(ID)) 
     { 
      throw new ArgumentException(nameof(ID)); 
     } 

     SqlConnection con = new SqlConnection(connectionString); 
     SqlCommand cmd = con.CreateCommand(); 
     cmd.CommandText = "INSERT INTO Users(ID,FirstName,Address)VALUES(@ID,@FirstName,@Address)"; 
     cmd.Parameters.AddWithValue("@ID", ID); 
     cmd.Parameters.AddWithValue("@FirstName", FirstName); 
     cmd.Parameters.AddWithValue("@Address", Address); 
     try 
     { 
      con.Open(); 
      cmd.ExecuteNonQuery(); 
     } 
     catch (SqlException ex) 
     { 
      throw; //use this instead throw ex, since it rewrites the callstack. 
     } 
     finally 
     { 
      con.Close(); 
     } 
    } 
} 

을 곧 Entit를 사용하는 것을 볼 수 있습니다 그러나 yFramework CodeFirst는 EntityFramework가 당신을 위해 많은 일을하기 때문에 훨씬 쉽고 실용적입니다. 하지만 계속해서 ADO.NET (SQL 명령)을 사용하여 자신의 DataAccess를 작성하는 것이 좋습니다. 그런 다음 EntityFramework가 좋은 점을 더 잘 이해하게 될 것입니다. 특히 MVVM 응용 프로그램에서 EntityFramework의 이점에 관심이 있다면 새로운 질문을하고 주석을 달아달라고하십시오.

  • 참고 : 비즈니스 논리와 대부분의 경우 프레젠테이션 논리이기 때문에 유효성 검사는 까다로운 부분입니다. 그러나 그것은 또 다른 주제입니다.
+0

그건 내 응용 프로그램이 아닙니다. 그것은 링크입니다. 나는 SQL이 어디로 가야 하는지를 알아 내려고 노력하고있다. 나는 구글 "SQL MVVM"을 찾은 후에 많은 것을 찾았습니다. VM에서 데이터베이스에 액세스하는 것이 나에게 잘못된 것처럼 보였으므로 여기에서 질문했습니다. 실제 응용 프로그램은 데이터 측면에서 크고 복잡하며 SQL이 필요합니다. UI 측면에는 제시 할 것이 많지 않습니다. – Paparazzi

+0

음, MVVM의 목표 중 하나는 응용 프로그램 로직을 테스트 할 수있게하는 것입니다. VM에 직접 데이터 액세스가있는 경우 테스트하기가 어렵습니다. MVVM은 잘 정의 된 프레임 워크가 아닙니다. 누구나해야 할 일에 대해 자신이 이해하고 있습니다. Testability, Maintanability, VS Designer의 디자인 타임 데이터 지원 등과 같은 목표를 정의하십시오. 저는 ViewModels와 같은 구성 요소의 책임을 정의 할 때 SRP와 DRY 원칙을 염두에 두어야한다고 생각합니다. 자연스럽게 대답 될 것입니다 :) – Liero

+0

어쨌든, MVVM의 모델은 "데이터 액세스 및 비즈니스 로직"의 약자입니다. SQL은 데이터 액세스이므로 모델에 대한 정의는 매우 간단합니다. – Liero

1

MVVM은 SqlConnection의 위치를 ​​지정하지 않습니다. 그것은 UI와 관련된 책임을 설명합니다.

대부분의 경우 아키텍처에는 데이터베이스에 연결해야하는 여러 ViewModel이 포함되어 있으므로 코드를 복제하지 않고 모든 연결을 통해 별도의 클래스에 대한 연결을 고려해야합니다. 이것이 전체 데이터 레이어이든, EF 모듈이든 간단한 단일 클래스이든간에 필요성과 선호도가 중요합니다.

관련 문제