あなたは(これはあなたがユニットにそれをテストすることができる唯一の方法ですので、私は個人的にプロジェクトの99.9%で、それを使用)依存性の注入を使用する必要があるシナリオのこれらの種類を処理するために。依存関係注入ライブラリ(Autofac、Ninject、Castle Windsor、Simple 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
が登録されます