Đây là một ví dụ phổ biến. Bạn cần phải đăng nhập vào ứng dụng của bạn. Tuy nhiên, tại thời điểm thiết kế, bạn không chắc chắn nếu khách hàng muốn đăng nhập vào cơ sở dữ liệu, tệp hoặc nhật ký sự kiện.
Vì vậy, bạn muốn sử dụng DI để trì hoãn lựa chọn đó thành lựa chọn có thể được khách hàng định cấu hình.
Đây là một số giả (khoảng dựa trên Unity):
Bạn tạo một giao diện đăng nhập:
public interface ILog
{
void Log(string text);
}
sau đó sử dụng giao diện này trong lớp học của bạn
public class SomeClass
{
[Dependency]
public ILog Log {get;set;}
}
tiêm những người phụ thuộc vào thời gian chạy
public class SomeClassFactory
{
public SomeClass Create()
{
var result = new SomeClass();
DependencyInjector.Inject(result);
return result;
}
}
và các trường hợp được cấu hình trong app.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name ="unity"
type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection,
Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity>
<typeAliases>
<typeAlias alias="singleton"
type="Microsoft.Practices.Unity.ContainerControlledLifetimeManager,Microsoft.Practices.Unity" />
</typeAliases>
<containers>
<container>
<types>
<type type="MyAssembly.ILog,MyAssembly"
mapTo="MyImplementations.SqlLog, MyImplementations">
<lifetime type="singleton"/>
</type>
</types>
</container>
</containers>
</unity>
</configuration>
Bây giờ nếu bạn muốn thay đổi kiểu logger, bạn chỉ cần đi vào cấu hình và xác định loại khác.
Martin Fowler có mô tả bao gồm: http: // martinfowler. com/articles/injection.html Theo như tài nguyên .NET, hãy xem: - [Castle Windsor] (http://www.castleproject.org/container/index.html) - [Spring.NET] (http: //www.springframework.net/) - [Autofac] (http://code.google.com/p/autofac/) - [Ninject] (http://ninject.org/) - [Unity] (http: //www.codeplex.com/unity) - [Sơ đồ cấu trúc] (http://structuremap.sourceforge.net/) – Codebrain
Hãy xem các bài viết sau đây có thể cung cấp một số trợ giúp về điều này: * [Windsor IoC Container trên một Nghỉ trưa] (http://jeremyjarrell.com/archive/2007/07/12/44.aspx) * [Bài viết MSDN về Inversion kiểm soát và Dependency Injection] (http://msdn.microsoft.com/en-us/library/aa973811.aspx) Liên kết chung về vùng chứa: * [Castle Project] (http: // www .castleproject.org/container/index.html) Vài liên kết SO có thể giúp thêm những điều về chủ đề: * [Câu hỏi Castle Windsor] (http://stackoverflow.com/questions/tagged/castle-windsor) * [ Câu hỏi IoC] (http://stackoverflow.com/questions/t –