如何获得统一的自动注射到注射界面构造的工作?
-
20-08-2019 - |
题
在统一文档指出:
如果一个类,实例化的开发人员 使用统一Resolve方法 容器有一个构造函数 定义了一个或多个依赖 其它类,的统一性容器 自动创建的依赖 在对象实例强>中指定 构造函数的参数
这是伟大的,但多数情况下我不指定 班的作为注射,但 接口的,所以作为使事情解耦。
因此,如何能予采取统一的自动注射的优点,当我.Resolve <>的一类指定的代替类注射接口注射强>
即。在下面的代码,我怎样才能使我改变我的客户构造它的工作为“公开客户(ILogger记录器)”
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);
}
}
}
解决方案
我从未使用过统一,但所有其他DI框架,我知道这是否和我敢肯定,团结必须做到这一点。
你有没有试图改变顾客的构造,看它是否工作? COS它应该。
其他提示
不知道是否为时已晚,但我觉得
使用(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");
}
}
将达到目的
使用通用
public interface ILogger<T> where T: class
{
}
public class BasicLogger:ILogger<BasicLogger>
{
}
public class AdvanceLogger:ILogger<AdvanceLogger>
{
}
不隶属于 StackOverflow