2012-11-10 5 views
1

저는 프로젝트를 구성하는 것에 대해 딜레마가 있습니다. 나는 뉴스 레터를 보내는 신청서를 작성 중입니다. 내 솔루션에서 세 개의 프로젝트로 나누었습니다 : Newsletter.UI (WPF), Newsletter.DALNewsletter.Services. Newsletter.DAL에는 EF가 생성하는 엔티티를 나타내는 클래스가 추가 파일 (부분 클래스)에서 향상되어 -을 재정의합니다. Newsletter.UI에는 프레젠테이션을위한 소스 WPF 프로젝트가 있습니다. 나를위한 문제는 Newsletter.Services으로 시작됩니다.Entity Framework를 사용하여 프로젝트에서 레이어를 구성하는 방법은 무엇입니까?

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Newsletter.DAL; 

namespace Newsletter.Services 
{ 
    public class MailingListService 
    { 
     private NewsletterEntities _context; 

     public MailingListService() 
     { 
      _context = new NewsletterEntities(); 
     } 

     public List<string> GetAllMailingListsNames() 
     { 
      var query = from m in _context.MailingLists select new { m.Name }; 
      List<string> names = new List<string>(); 
      foreach (var m in query) 
       names.Add(m.Name); 
      return names; 
     } 

     public List<MailingList> GetAllMailingLists() 
     { 
      var query = from m in _context.MailingLists select m; 
      return query.ToList();  
     } 
    } 
} 

MessageService.cs :

지금은 내가 MailingListService.cs 만든 그러나

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using Newsletter.DAL; 
using System.Data.Entity; 

namespace Newsletter.Services 
{ 
    public class MessageService 
    { 
     private NewsletterEntities _context; 

     public MessageService() 
     { 
      _context = new NewsletterEntities(); 
     } 

     public List<Message> GetAllMessages() 
     { 
      return (from m in _context.Messages select m).ToList(); 
     } 

     public static Message GetMessageByID(int id) 
     { 
      using (NewsletterEntities context = new NewsletterEntities()) 
      { 
       Message message = (from m in context.Messages where m.MessageID == id select m).FirstOrDefault(); 
       return message; 
      } 
     } 
    } 
} 

RecipientService.cs

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using Newsletter.DAL; 

namespace Newsletter.Services 
{ 
    public class RecipientService 
    { 
     private NewsletterEntities _context; 
     public RecipientService() 
     { 
      _context = new NewsletterEntities(); 
     } 
     public void addRecipient(Recipient newRecipient) 
     { 
      _context.Recipients.AddObject(newRecipient); 
     } 
    } 
} 

을,이 문제가 가져옵니다. 수신자 생성을위한 창을 열면 MailingListService 인스턴스를 생성하여 메일 링리스트의 이름을로드합니다. 그런 다음 새 Recipient을 만들려고하면 RecipientService 인스턴스를 만들고받는 사람을 추가하려고합니다. 다른 곳에서 컨텍스트를 사용할 수 없다는 오류가 발생합니다.

해결 방법? 내 접근 방식이 안 좋은가? 무엇이되어야 하는가? (서비스에서 무엇이 있어야 하는가?) 나는 미래에 그런 실수를하고 싶지 않다. MVVM 접근법을 배우고 싶지는 않습니다. 지금하고있는 방식과 다소 차이가 있습니다.

+1

정확한 오류 메시지는 무엇입니까? 그리고 어떤 라인에서 오류가 발생합니까? – Martin4ndersen

답변

1

여러 가지 방법이 가능하다 : 비즈니스 트랜잭션에 대한

  1. 하나를 사용하여 상황에 맞는 인스턴스입니다. 컨텍스트는 서비스 외부에서 작성되어야하며 메소드 또는 생성자를 통해 서비스로 전달되어야합니다. 이렇게하려면 하위 수준 서비스 (예 : 지금 가지고있는 서비스)를 조율하는 상위 수준 서비스 (또는 façades) 계층이 필요합니다. IoC 컨테이너는 façade 서비스 인스턴스의 라이프 사이클과 결합 된 컨텍스트를 작성하고 삽입하는 데 도움이 될 수 있습니다.

  2. 분리/부착. AddRecipient 방법에서는 먼저받는 사람을 분리하고 (첨부되어 있는지 확인한 후) 현재 컨텍스트에 첨부합니다. 그러나 작업 단위는 두 개의 컨텍스트 인스턴스간에 나뉘며 트랜잭션을 유지하려면 TransactionScope이 필요합니다.

  3. 높은 레벨에서 집합체. 메일 링리스트, 메시지 및 수신자를 처리하는 MailService을 작성하십시오.

  4. 혼합 접근법. 메서드 서명 (예 : public Recipient AddRecipient(NewsletterEntities context, string name, string email))에 컨텍스트 인수가있는 메서드가있는 자체 컨텍스트 인스턴스 및 (바람직하게는 상태 비 저장) 서비스를 사용하는 서비스입니다. 이름을 전달하면 서비스가 새로운 Recipient 개체를 만들거나, 이미 거기에).

단지 몇 가지 생각 :).

관련 문제