3. Example
public class DocumentPrinter
{
public void PrintDocument(string documentName)
{
var repository = new DocumentRepository();
var formatter = new DocumentFormatter();
var printer = new Printer();
var document = repository.GetDocumentByName(documentName);
var formattedDocument = formatter.Format(document);
printer.Print(formattedDocument);
}
}
var document = new DocumentPrint();
documentPrinter.PrintDocument(@”C:xxx.doc”);
4. Contructor DI
public class DocumentPrinter
{
private DocumentRepository _repository;
private DocumentFormatter _formatter;
private Printer _printer;
public DocumentPrinter(DocumentRepository repository, DocumentFormatter formatter, Printer printer)
{
_repository = repository; _formatter = formatter; _printer = printer;
}
public void PrintDocument(string documentName)
{
var document = _repository.GetDocumentByName(documentName);
var formattedDocument = _formatter.Format(document);
_printer.Print(formattedDocument);
}
}
5. Contructor DI
var repository = new DocumentRepository();
var formatter = new DocumentFormatter();
var printer = new Printer();
var documentPrinter = new DocumentPrinter(repository, formatter, printer);
documentPrinter.PrintDocument(@”C:xxx.doc”);
7. DI - Interface
public class DocumentPrinter
{
private IDocumentRepository _repository;
private IDocumentFormatter _formatter;
private IPrinter _printer;
public DocumentPrinter(IDocumentRepository repository, IDocumentFormatter formatter, IPrinter printer)
{
_repository = repository; _formatter = formatter; _printer = printer;
}
public void PrintDocument(string documentName)
{
var document = _repository.GetDocumentByName(documentName);
var formattedDocument = _formatter.Format(document);
_printer.Print(formattedDocument);
}
}
8. DI - Interface
var repository = new FilesystemDocumentRepository();
var formatter = new DocumentFormatter();
var printer = new Printer();
var documentPrinter = new DocumentPrinter(repository, formatter, printer);
documentPrinter.PrintDocument(@”C:xxx.doc”);
OR
var repository = new DatabaseDocumentRepository();
var formatter = new DocumentFormatter();
var printer = new Printer();
var documentPrinter = new DocumentPrinter(repository, formatter, printer);
documentPrinter.PrintDocument(”xxx.doc”);
9. DI Container
Ex. StructureMap、Castle、Windsor、Ninject、Autofac and Unity
using StructureMap:
var container = new Container(x =>
{
x.For<IDocumentRepository>().Use<DocumentRepository>();
x.For<IDocumentFormatter>().Use<DocumentFormatter>();
x.For<IPrinter>().Use<Printer>();
});
var documentPrinter = container.GetInstance<DocumentPrinter>();
documentPrinter.PrintDocument(@”C:xxx.doc”);
10. DI - ASP.NET MVC
Controller 不應該執行:
直接進行資料庫存取
直接和檔案系統溝通
直接傳送 e-mail
直接呼叫 web service
11. DI - ASP.NET MVC
● Controller factory
● Dependency resolver
12. DI - Controller Factory
public interface IMessageProvider
{
string GetMessage();
}
public class EnglishMessageProvider : IMessageProvider
{
public string GetMessage()
{
return "Hello!";
}
}
13. DI - Controller Factory
HomeController.cs
public class HomeController : Controller
{
private IMessageProvider _messageProvider;
public HomeController( IMessageProvider messageProvider )
{
_messageProvider = messageProvider;
}
public ActionResult Index()
{
ViewBag.Message = _messageProvider.GetMessage();
return View();
}
}
14. DI - Controller Factory
StructureMapControllerFactory.cs
public class StructureMapControllerFactory: DefaultControllerFactory
{
protected override IController GetControllerInstance(RequestContext requestContext, Type controllerType)
{
if (controllerType == null)
{
throw new HttpException(404, "Controller not found");
}
var container = new Container(x =>
{
x.For<IMessageProvider>().Use<EnglishMessageProvider>();
});
return container.GetInstance(controllerType) as IController;
}
}