Wie Unity automatische Injektion arbeiten an der Schnittstelle injiziert Konstrukteuren zu bekommen?

StackOverflow https://stackoverflow.com/questions/658360

Frage

Die Unity-Dokumentation heißt es:

  

, wenn eine Klasse, die Entwickler instanziiert   unter Verwendung der Methode der Resolve Unity   Behälter hat einen Konstruktor,   definiert eine oder mehr Abhängigkeiten von   andere Klassen, die Einheit Container   erstellt automatisch die abhängigen   Objektinstanz angegeben in   Parameter des Konstruktors

Das ist großartig, aber die meisten oft ich nicht angeben Klassen für die Injektion jedoch Schnittstellen , so wie um die Dinge entkoppelt.

Wie kann ich in Anspruch nehmen Unity automatische Injektion, wenn ich .Resolve <> eine Klasse, die Schnittstelle Injektion gibt statt Klasse Injektion?

d. im folgenden Code, wie kann ich damit es funktioniert, wenn ich meine Kunden Konstruktor „ Öffentliche Auftraggeber (ILogger Logger) “ ändern?

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

}
War es hilfreich?

Lösung

Ich habe noch nie das auch tun müssen Unity, aber jeder andere DI Rahmen Ich weiß, tut das, und ich bin sicher, dass die Einheit verwendet.

Haben Sie versucht, die Änderung der Kunden Konstruktor und zu sehen, ob es funktioniert? Cos es sollte.

Andere Tipps

Nicht sicher, wenn sie zu spät, aber ich denke,

mit (IUnityContainer Container = new 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");
            }
        }

den Trick

Verwenden generic

public interface ILogger<T> where T: class
{

}

public class BasicLogger:ILogger<BasicLogger>
{

}

public class AdvanceLogger:ILogger<AdvanceLogger>
{

}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top