我是依赖注入的新手。我刚刚熟悉了如何使用接口注入实现依赖注入,但我们知道依赖注入可以通过三种方式实现,或者可能更多,它们是:-
- 接口注入:服务提供消费者必须实现的接口。该接口在运行时公开特定行为。
- Setter 注入:依赖对象公开了一个“setter”方法来注入依赖项。
- 构造函数注入:依赖是通过类构造函数注入的
所以我正在寻找一些示例代码,它们可以帮助我了解如何使用 Setter 注入或使用 Unity 的构造函数注入来实现依赖注入。对于实现依赖注入的不同方式的小代码的任何帮助将不胜感激。
我只知道使用统一的接口注入。这是我的代码,它使用统一的接口注入可以正常工作。
public interface ILogger
{
void Write(string message);
}
We have define three classes as follows.
public class FileLogger : ILogger
{
public void Write(string message)
{
//Do somthing
}
}
public class SQLLogger : ILogger
{
public void Write(string message)
{
//Do somthing
}
}
public class WindowsEventLogger : ILogger
{
public void Write(string message)
{
//Do somthing
}
}
需要在配置文件(即app.config)中注册和映射这些类与接口。
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<alias type="UnityTest.ILogger, UnityTest" alias="ILogger" />
<namespace name="UnityTest"/>
<container>
<register mapTo="UnityTest.FileLogger, UnityTest" name="MyFileLogger" type="ILogger"/>
<register mapTo="UnityTest.SQLLogger, UnityTest" name="MySQLLogger" type="ILogger"/>
<register mapTo="UnityTest.WindowsEventLogger, UnityTest" name="MyWindowsEventLogger" type="ILogger"/>
</container>
</unity>
注意:名称属性在注册标签中很重要。
最后我们必须在我们的代码中使用这个映射。因此,我们必须知道哪个更适合特定国家/地区。
字典对象可用于保持此映射如下。
IDictionary<string, string> loggers = new Dictionary<string, string>();
loggers.Add("USA", "MyFileLogger");
loggers.Add("GBR", "MySQLLogger");
loggers.Add("IN", "MyWindowsEventLogger");
您可以从数据库、xml 或其他来源填充它,现在是时候调用 Write 方法了。
IUnityContainer container = new UnityContainer();
container.LoadConfiguration();
ILogger logger = container.Resolve<ILogger>(loggers[objUser.countryCode]);
logger.Write("Hello World");
新问题
我找到了一个统一的构造注入示例代码,但仍有一件事不清楚。这是代码。
public class CustomerService
{
public CustomerService(LoggingService myServiceInstance)
{
// work with the dependent instance
myServiceInstance.WriteToLog("SomeValue");
}
}
IUnityContainer uContainer = new UnityContainer();
CustomerService myInstance = uContainer.Resolve<CustomerService>();
当我们编写时uContainer.Resolve<CustomerService>();
,我们没有发送任何 LoggingService 类的实例,那么我们如何创建CustomerService
类的实例,因为它的构造函数需要LoggingService
.
这个区域不清楚。请向我解释它是如何工作的。
另一个问题是[Dependency]
属性:它做什么,以及何时需要用[Dependency]
属性修饰方法。