关于数据查找常量的问题

时间:2011-01-22 21:51:46

标签: asp.net-mvc separation-of-concerns

我的项目Web / UI,服务,存储库,Common以及其他一些我认为不适用于此案例的图层。

我有一个电子邮件表,可以将所有网站生成的电子邮件数据保存在其中。我还有一个名为EmailType的表,它跟踪应该调用电子邮件表中的哪个电子邮件。

在我的电子邮件服务中,我有以下方法。

public string SendPurchaseConfirmationEmail(string email, string firstName, string dealName) {
   Email email =  EmailRepository.GetByCurrentByType(EmailType.PurchaseEmail.GetStringValue());
   variables = createVariablesList();
   SendEmail(email.ListId, email.externalEmailId, variables);
}

EmailType是一个带有扩展名的unum,用于获取值属性,这是一个guid并存储在我的存储库中。 EmailType表在生成测试电子邮件的管理员中运行良好,但对于实际的Web层,对服务的调用需要存储库中的硬编码值。

我的问题是,这是最佳或推荐的方式吗?或者我可以通过某种方式使其更具活力?我不喜欢的部分是我的服务层需要为每个电子邮件提供一种方法,因为Web层应该触及存储库。

如果担心代码分离,也会将服务层中的枚举置于不正确的位置。

谢谢,

2 个答案:

答案 0 :(得分:0)

将服务方法更改为此

public string SendConfirmationEmail(EmailType selectedType, string email, string firstName, string dealName) {    
    Email email =  EmailRepository.GetByCurrentByType(selectedType);    
    variables = createVariablesList();    
    SendEmail(email.ListId, email.externalEmailId, variables);
}

关于“web层”调用(从视图中调用服务),我不知道你究竟是什么意思,但如果它是AJAX调用,那么你可以使用enum进行调用。 除了AJAX,我真的不知道你可以做什么样的调用,因为你基本上在MVC中有GET和POST。 当您对控制器操作进行POST时,您可以再次使用枚举。

喜欢这个

EmailService.SendConfirmationEmail(EmailType.Purchase, email, fname, dealname);

当然,如果您将服务方法设为静态,则上述示例有效。

答案 1 :(得分:0)

是的,您需要在“服务”层和数据库中为这组电子邮件类型重复一些“关键”值。

如果您不使用电子邮件表中存储的“外键”值(或其他容易映射到数据库代码中的值的值),那么您将需要使用您的数据库执行数据库查找电子邮件类型表。

我建议为电子邮件类型表使用整数代理键,并创建一组命名数字常量,这些常量映射到需要使用该组类型的任何层中的那些代理键值(特别是如果该层连接到数据库本身)。每个其他层都应该通过其中一个层使用这组名称常量。