在统一文档指出:

  

如果一个类,实例化的开发人员   使用统一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>
{

}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top