Единица: как указать для использования определенного экземпляра типа при разрешении другого типа

Я обнаружил, что это проблема эмулятора. Я не пробовал все эмуляторы, но я использовал эмуляторы от Android Studio. После того, как я подключился к настоящей синей зубной клавиатуре, программа может корректно получать события KEYCODE_PAGE_UP и KEYCODE_PAGE_DOWN! Поэтому я советую, если вы хотите протестировать клавиатуру / мышь, не полагайтесь на эмуляторы!

6
задан Darko Z 3 March 2010 в 05:09
поделиться

5 ответов

Вот быстрый пример, который я сделал, Вы используете RegisterInstance, или можно использовать Пожизненное управление Claas

static void Main(string[] args)
{
    IUnityContainer container = new UnityContainer();

    container.RegisterType<Type1>();

    container.RegisterInstance<Type2>(new Type2());

    Type1 t = container.Resolve<Type1>();

    Type2 t2 = container.Resolve<Type2>();

    Type3 t3 = container.Resolve<Type3>();

    Console.ReadKey();
}

public class Type1
{
}

public class Type2
{
}

public class Type3
{
    private Type1 t;
    private Type2 t2;
    public Type3(Type1 t, Type2 t2)
    {
        this.t = t;
        this.t2 = t2;
    }
}

Обновление: Я включал тип с двумя параметрами в конструкторе, чтобы показать, что он может также быть разрешен.

2
ответ дан 17 December 2019 в 20:35
поделиться

Попытка с помощью именованных экземпляров:


IUnityContainer container = new UnityContainer();
container.RegisterType<Type1>();
container.RegisterType<Type2>("Instance 1", new ContainerControlledLifetimeManager());
container.RegisterType<Type2>("Instance 2", new ContainerControlledLifetimeManager());
container.RegisterType<Type3>();

Type1 type1 = container.Resolve<Type1>();
if (type1 == ...)
{
  Type2 instance1 = container.Resolve<Type2>("Instance 1");
}
else
{
  Type2 instance2 = ontainer.Resolve<Type2>("Instance 2");
}


Можно сделать, некоторые проверяют тип 1, и решите, в каком экземпляре типа 2 Вы будете нуждаться. Обратите внимание, что "новый ContainerControlledLifetimeManager ()" параметр инициализирует одноэлементный экземпляр типа, которому сопротивляются, таким образом, Вы будете всегда получать тот же экземпляр типа 2.

Обновление: То же с интерфейсами.Надеюсь, это поможет.


IUnityContainer container = new UnityContainer();
container.RegisterType<TextDocument>();
container.RegisterType<ImageDocument>();
container.RegisterType(typeof (IView), typeof (TextView), "Text", new ContainerControlledLifetimeManager());
container.RegisterType(typeof (IView), typeof (ImageView), "Image", new ContainerControlledLifetimeManager());

IDocument document = container.Resolve<TextDocument>();

IView view = null;
if (document is TextDocument)
{
    view = container.Resolve<IView>("Text");
}
else
{
    view = container.Resolve<IView>("Image");
}

view.Show();

0
ответ дан 17 December 2019 в 20:35
поделиться

Я не хочу регистрировать экземпляр Type2 в исходном контейнере. Экземпляр type2 может отличаться для различных экземпляров Type1.

Моя следующая попытка состоит в том, чтобы создать дочерний контейнер и зарегистрировать определенный экземпляр Type2 там.

0
ответ дан 17 December 2019 в 20:35
поделиться

Если у Вас есть класс с несколькими конструкторами, можно решить, какой конструктор используется контейнером Единицы использование атрибута "InjectionConstructor". Это дает Вам возможность установить некоторые параметры вручную.


public class Test
{
    public Test()
    {
    }

    // Always use the following constructor
    [InjectionConstructor]
    public Test(Type1 type1) : this()
    {
    }

    public Test(Type1 type1, Type2 type2) : this(type1)
    {
    }
}

0
ответ дан 17 December 2019 в 20:35
поделиться

Использовать фабрику.

public class Type1Factory
{
  private Type3 type3;

  public Type1Factory(Type3 _type3)
  {
     type3 = _type3;
  }

  public GetType1(Type2 type2)
  {
    return new Type1(type2, type3);
  }
}

Назовите это так:

// SpellingChecker is subclass of Type3
IUnityContainer container = new UnityContainer();
container.RegisterType<Type3>(typeof(SpellingChecker));

// DocumentViewer is subclass of Type2
Type1Factory factory = container.Resolve<Type1Factory>();
Type1 type1 = factory.GetType1(new DocumentViewer());

Это предполагает, что вы пытаетесь использовать Unity только для разрешения зависимости Type3 и что у вас нет контроля над конструкторами в Type1. Если вы можете редактировать Type1, воспользуйтесь предложением Alexader R., чтобы Unity разрешала только конструктор с одним параметром.

0
ответ дан 17 December 2019 в 20:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: