1

プロジェクトの編成についてジレンマがあります。ニュースレターを送信するためのアプリケーションを作成しています。私のソリューションでは、Newsletter.UI(WPF)Newsletter.DALNewsletter.Services. 追加のファイルで強化された EF によって生成されるエンティティを表すクラスがあります(Newsletter.DALそれらは部分クラスです) - overriden ToString()。もちろん、Newsletter.UIプレゼンテーション用のWPFプロジェクトがあります。私にとっての問題は から始まりますNewsletter.Services

今のところ私は作成しましたMailingListService.cs

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:

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メーリング リストの名前を読み込むインスタンスが作成されます。次に、新しい を作成しようとするとRecipientRecipientServiceインスタンスを作成して受信者を追加しようとします。別の場所でコンテキストを使用できないというエラーが表示されます。

これを解決する方法は?私のアプローチは悪いですか?それは何であるべきですか(サービスにあるべきもの)?今後、このようなエラーにはなりたくありません。私は今MVVMアプローチを学びたくありません.多かれ少なかれ私がやっている方法でこれを行う必要があります.

4

1 に答える 1

1

いくつかのアプローチが可能です:

  1. ビジネス トランザクションには 1 つのコンテキスト インスタンスを使用します。コンテキストはサービスの外部で作成し、メソッドまたはコンストラクターを介してサービスに渡す必要があります。これには、下位レベルのサービス (現在のサービスなど) を調整する上位レベルのサービス (ま​​たはファサード) のレイヤーが必要になります。IoC コンテナーは、ファサード サービス インスタンスのライフ サイクルにバインドされたライフ サイクルを使用して、コンテキストを作成および挿入するのに役立ちます。

  2. デタッチ/アタッチ。メソッドでは、AddRecipient最初に受信者を切り離し (添付されているかどうかを確認した後)、現在のコンテキストに添付します。ただし、現在、作業単位は 2 つのコンテキスト インスタンスに分割されTransactionScopeており、トランザクションの健全性を維持するために が必要になります。

  3. MailServiceメーリング リスト、メッセージ、および受信者を扱う を作成するなどして、より高いレベルで集約します。

  4. 混合アプローチ。独自のコンテキスト インスタンスを持つサービスと、メソッド シグネチャにコンテキスト引数を持つメソッドを持つ (できればステートレスな) サービス( public Recipient AddRecipient(NewsletterEntities context, string name, string email).Recipientそこの)。

ほんの少しの考え:)。

于 2012-11-10T15:51:08.693 に答える