Unity文档说明:
如果是开发人员实例化的类 使用Unity的Resolve方法 容器有一个构造函数 定义一个或多个依赖项 其他类, Unity容器 自动创建依赖项 在。中指定的对象实例 构造函数的参数
这很棒,但我通常不指定 类 进行注射,但是 接口 ,所以为了让事情脱钩。
那么当我.Resolve<>时,如何利用Unity的自动注入? 指定接口注入的类而不是类注入?
即。在以下代码中,当我将Customer构造函数更改为“公共客户(ILogger logger)”时,如何使其工作?
using System;
using Microsoft.Practices.Unity;
namespace TestUnityInjection23
{
public class Program
{
static void Main(string[] args)
{
Customer customer1 = new Customer(new BasicLogger());
//Customer customer2 = new Customer(new AdvancedLogger()); //can't use this since Customer only accepts BasicLogger
UnityContainer container = new UnityContainer();
container.RegisterType<Customer>();
container.RegisterType<ILogger, BasicLogger>();
Customer customer3 = container.Resolve<Customer>();
Console.ReadLine();
}
}
public class Customer
{
public Customer(BasicLogger logger) //would like to have Customer depend on ILogger here so logger can be swapped out
{
logger.WriteToLog("creating the customer");
}
}
public interface ILogger
{
void WriteToLog(string text);
}
public class BasicLogger : ILogger
{
public void WriteToLog(string text)
{
Console.WriteLine(text);
}
}
public class AdvancedLogger : ILogger
{
public void WriteToLog(string text)
{
Console.WriteLine("*** {0} ***", text);
}
}
}
答案 0 :(得分:1)
我从来没有使用Unity,但我知道的其他所有DI框架都是这样做的,我相信Unity也必须这样做。
您是否尝试过更改Customer构造函数并查看它是否有效?应该这样。
答案 1 :(得分:1)
不确定是否为时已晚但我认为
使用(IUnityContainer容器=新的UnityContainer()) { container.RegisterType();
container
.RegisterType<ILogger, BasicLogger>()
.Configure<InjectedMembers>()
.ConfigureInjectionFor<Customer>(new InjectionConstructor(typeof(BasicLogger)));
var customer3 = container.Resolve<Customer>();
}
Console.ReadLine();
public class Customer
{
public BasicLogger Logger { get; set; }
public Customer(ILogger logger)
{
logger.WriteToLog("creating the customer");
}
}
会做的伎俩
答案 2 :(得分:0)
使用通用
public interface ILogger<T> where T: class
{
}
public class BasicLogger:ILogger<BasicLogger>
{
}
public class AdvanceLogger:ILogger<AdvanceLogger>
{
}