我的项目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层应该触及存储库。
如果担心代码分离,也会将服务层中的枚举置于不正确的位置。
谢谢,
答案 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)
是的,您需要在“服务”层和数据库中为这组电子邮件类型重复一些“关键”值。
如果您不使用电子邮件表中存储的“外键”值(或其他容易映射到数据库代码中的值的值),那么您将需要使用您的数据库执行数据库查找电子邮件类型表。
我建议为电子邮件类型表使用整数代理键,并创建一组命名数字常量,这些常量映射到需要使用该组类型的任何层中的那些代理键值(特别是如果该层连接到数据库本身)。每个其他层都应该通过其中一个层使用这组名称常量。