0

У меня есть класс (Service), который получает 2 аргумента (IClient и ICounter).Как сделать Unity инъекцией одного экземпляра для 2 зарегистрированных интерфейсов

Я хочу Unity впрыснуть тот же экземпляр как дляDecorator, который реализует оба интерфейса).

Но как?

И еще одна вещь: я хочу, чтобы придать единство и тот же экземпляр Service с использованием каждого потока основы. Это, в каждом потоке, каждый раз, когда container.Resolve<Service>() вызывается, то же экземпляр Decorator должен быть введен в обоих аргументов Service

Это код, который я до сих пор. Я только регистрирую типы и запускаю их, но создаются 3 экземпляра класса Decorator. В этом случае, только с одним потоком, должен быть создан только один экземпляр Decorator.

Вы можете запустить его с DotNetFiddle: https://dotnetfiddle.net/Widget/m3PRQz

using System; 
using Microsoft.Practices.Unity; 

namespace ConsoleApplication1 
{ 
    public class Program 
    { 
     public static void Main(string[] args) 
     { 
      var container = new UnityContainer(); 

      container.RegisterType<IClient>(new InjectionFactory(c => new Decorator(c.Resolve<Client>()))); 
      container.RegisterType<ICounter, Decorator>(); 

      container.Resolve<Service>(); 

      Console.WriteLine(Decorator.NumberOfInstances + " instances of Decorator have been created"); 
     } 
    } 

    public class Client : IClient 
    { 
    } 

    public class Decorator : IClient, ICounter 
    { 
     public static int NumberOfInstances { get; private set; }     
     public Decorator(IClient client) 
     { 
      NumberOfInstances++; 
     }   
    } 

    public interface ICounter 
    { 
    } 

    public interface IClient 
    { 
    } 

    public class Service 
    { 
     public Service(IClient client, ICounter counter) 
     { 
     }  
    } 
} 

EDIT: Если я не использую DI, я бы написать этот код. Имейте в виду, что я не вызываю никакого метода для простоты.

public class Program 
{ 
    public static void Main(string[] args) 
    { 
     var t1 = Task.Run(() => CreateService()); 
     var t2 = Task.Run(() => CreateService()); 
    } 

    private static Service CreateService() 
    { 
     var decorator = new Decorator(new Client()); 
     return new Service(decorator, decorator); 
    } 
} 
+0

Пожалуйста, покажите нам код, который вы будете использовать для составьте этот граф объекта, если вы не используете контейнер DI. – Steven

+0

@Steven Пожалуйста, взгляните на редактируемый вопрос. Для каждого потока у меня будет Служба и Декоратор, которые являются как IClient, так и ICounter. – SuperJMN

+0

Ваш декоратор может реализовать 'ICounter', но он только обертывает' IClient', поэтому он не является декоратором для 'ICounter'. Как этот «Decorator» перенаправляет вызовы на реальный «ICounter» в случае использования его методов «ICounter»? – Steven

ответ

1

Вы можете попробовать что-то вроде этого:

регистра Decorator для каждого потока:

container.RegisterType<Decorator>(
    new PerThreadLifetimeManager(), 
    new InjectionFactory(c => new Decorator(c.Resolve<Client>()))); 

карта интерфейсов декоратор:

container.RegisterType<ICounter, Decorator>(); 
container.RegisterType<IClient, Decorator>(); 
Смежные вопросы