我对组织项目感到困惑。我正在构建一个发送新闻通讯的应用程序。我在我的解决方案中将其分为三个项目:Newsletter.UI
(WPF),Newsletter.DAL
和Newsletter.Services
。在Newsletter.DAL
中,有些类表示通过EF在其他文件中增强生成的实体(它们是部分类) - 覆盖ToString()
。在Newsletter.UI
中有用于演示的cource 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
实例来加载邮件列表的名称。然后,当我尝试创建新的Recipient
时,我创建了一个RecipientService
实例并尝试添加收件人。我收到一个错误,我不能在不同的地方使用上下文。
如何解决这个问题?我的方法不好吗?它应该是什么(服务中应该是什么)?我不希望将来遇到这样的错误。我现在不想学习MVVM方法,我需要或多或少地按照我的方式去做。
答案 0 :(得分:1)
有几种方法可以:
将一个上下文实例用于业务事务。应在服务之外创建上下文,并通过其方法或构造函数将其传递给服务。这需要一层更高级别的服务(或外观)来协调更低级别的服务(就像你现在所拥有的那样)。 IoC容器可以帮助您创建和注入具有与façade服务实例绑定的生命周期的上下文。
分离/附加。在AddRecipient
方法中,首先分离收件人(在检查它是否已附加之后)并将其附加到当前上下文。但是:现在,工作单元在两个上下文实例之间分开,您需要TransactionScope
才能使其在事务上保持合理。
在更高级别聚合,例如通过创建处理邮件列表,邮件和收件人的MailService
。
混合方法。使用自己的上下文实例和(最好是无状态)服务来提供服务,这些服务在方法签名中具有带上下文参数的方法(如public Recipient AddRecipient(NewsletterEntities context, string name, string email)
。(通过传递名称等,服务将负责创建新的Recipient
对象或返回现有的对象(如果它们已经存在)。
只是一些想法:)。