У меня есть класс (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);
}
}
Пожалуйста, покажите нам код, который вы будете использовать для составьте этот граф объекта, если вы не используете контейнер DI. – Steven
@Steven Пожалуйста, взгляните на редактируемый вопрос. Для каждого потока у меня будет Служба и Декоратор, которые являются как IClient, так и ICounter. – SuperJMN
Ваш декоратор может реализовать 'ICounter', но он только обертывает' IClient', поэтому он не является декоратором для 'ICounter'. Как этот «Decorator» перенаправляет вызовы на реальный «ICounter» в случае использования его методов «ICounter»? – Steven