2016-04-04 15 views
0

asp.net mvcでアプリケーションを開発しています。また、アクションが入力されたときに電子メールを送信する必要があります。Asp.net電子メールを発行しても公開しません。

public class MyController : Controller{ 

    public ActionResult Create(string name){ 

     // create and save to database 

     // if success 
     // select admin emails from database. 
     // create email content and subject. 
     // send email to admins. 
    } 
} 

私のプロジェクトを公開した後、自動的に送信メカニズムを有効にしたいと思います。開発時には、作成アクションで電子メールを送信する必要はありません。

これを行う設定はありますか?

答えて

0

あなたは(これはあなたがユニットにそれをテストすることができる唯一の方法ですので、私は個人的にプロジェクトの99.9%で、それを使用)依存性の注入を使用する必要があるシナリオのこれらの種類を処理するために。依存関係注入ライブラリ(AutofacNinjectCastle WindsorSimple Injectorなど)を使用すると、一部の構成でランタイムベースの依存関係を解決できます。たとえば、あなたがメールを送信する責任がある通信サービスを持っている:私のコントローラはコンストラクタ・インジェクションを経由して依存性注入ライブラリによってインスタンス化されようとしているタイプのICommuniucationServiceの私有財産を持っているとしている

public interface ICommuniucationService 
{ 
    void SendEmail(....); 
} 

public class CommunicationService : ICommuniucationService 
{ 
    public void SendEmail(...) 
    { 
     //real implementation of sending email 
    } 
} 

public class FakeCommunicationService : ICommuniucationService 
{ 
    public void SendEmail(...) 
    { 
     //do nothing. 
     return; 
    } 
} 

protected void Application_Start(object sender, EventArgs e) {  
    var container = new Container(); 
#if DEBUG 
    container.Register<ICommuniucationService, FakeCommuniucationService>(Lifestyle.Singleton); 
#else 
    container.Register<ICommuniucationService, CommuniucationService>(Lifestyle.Singleton); 
#endif   

    container.Verify(); 
    DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container)); 
} 
:依存性注入コンテナを設定する場合
public class MyController : Controller{ 

    //this will be resolved in runtime(either CommuniucationService or FakeCommunicationService) 
    private readonly ICommuniucationService EmailSvc; 

    // Use constructor injection for the dependencies 
    public MyController(ICommuniucationService svc) { 
     this.EmailSvc= svc;  
    } 

    public ActionResult Create(string name){ 

     // create and save to database 

     // if success 
     // select admin emails from database. 
     // create email content and subject. 

     this.EmailSvc.SendEmail(...) 

     //The action code doesn't change neither for 
    } 
} 

あなたは(これにSimple injector example似た)このような何かを行うことができます

プロジェクトがDEBUGモードで実行されている場合、は電子メールを送信せず、RELEASEモードで実行すると(アプリケーションの公開時に使用する)CommuniucationServiceが登録されます

1

プロパティHttpRequest.IsLocalプロパティを使用できます。

public class MyController : Controller 
{ 
    public ActionResult Create(string name) 
    { 
     if (HttpContext.Current.Request.IsLocal) { ... } 
     else { ... } 
    } 
} 
関連する問題