0

我有一个ASP.NET MVC3站点,我希望能够使用不同类型的电子邮件服务,具体取决于站点的繁忙程度。MVC中的Unity Framework构造参数

考虑以下几点:

public interface IEmailService 
{ 
    void SendEmail(MailMessage mailMessage); 
} 

public class LocalEmailService : IEmailService 
{ 
    public LocalEmailService() 
    { 
     // no setup required 
    } 

    public void SendEmail(MailMessage mailMessage) 
    { 
     // send email via local smtp server, write it to a text file, whatever 
    } 
} 

public class BetterEmailService : IEmailService 
{ 
    public BetterEmailService (string smtpServer, string portNumber, string username, string password) 
    { 
     // initialize the object with the parameters 
    } 

    public void SendEmail(MailMessage mailMessage) 
    { 
     //actually send the email 
    } 
} 

虽然该网站是在发展中,我所有的控制器将通过LocalEmailService发送电子邮件;当网站正在生产时,他们将使用BetterEmailService。

我的问题是双重的:

1)究竟如何通过BetterEmailService构造函数的参数?难道这样的事情(从〜/ Bootstrapper.cs):

private static IUnityContainer BuildUnityContainer() 
    { 
     var container = new UnityContainer(); 
     container.RegisterType<IEmailService, BetterEmailService>("server name", "port", "username", "password");  

     return container; 
    } 

2)是否有这样做的更好的方式 - 即把这些钥匙在web.config或其他配置文件,使该网站将不需要重新编译来切换它使用的电子邮件服务?

非常感谢!

回答

1

由于开发和生产之间的切换是一个部署“东西”,我会放置一个标志在web.config并做好登记如下:

if (ConfigurationManager.AppSettings["flag"] == "true") 
{ 
    container.RegisterType<IEmailService, BetterEmailService>(); 
} 
else 
{ 
    container.RegisterType<IEmailService, LocalEmailService>(); 
} 

1)究竟是如何做我传递BetterEmailService构造函数 参数?

你可以注册创建该类型的委托的InjectionFactory

container.Register<IEmailService>(new InjectionFactory(c => 
    return new BetterEmailService(
     "server name", "port", "username", "password"))); 
+0

好极了,谢谢! – ubersteve

相关问题