如何让Unity的自动注入工作在接口注入的构造函数上?

时间:2009-03-18 14:01:26

标签: dependency-injection unity-container

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);
        }
    }

}

3 个答案:

答案 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>
{

}