Я обнаружил, что это проблема эмулятора. Я не пробовал все эмуляторы, но я использовал эмуляторы от Android Studio. После того, как я подключился к настоящей синей зубной клавиатуре, программа может корректно получать события KEYCODE_PAGE_UP и KEYCODE_PAGE_DOWN! Поэтому я советую, если вы хотите протестировать клавиатуру / мышь, не полагайтесь на эмуляторы!
Вот быстрый пример, который я сделал, Вы используете 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;
}
}
Обновление: Я включал тип с двумя параметрами в конструкторе, чтобы показать, что он может также быть разрешен.
Попытка с помощью именованных экземпляров:
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();
Я не хочу регистрировать экземпляр Type2 в исходном контейнере. Экземпляр type2 может отличаться для различных экземпляров Type1.
Моя следующая попытка состоит в том, чтобы создать дочерний контейнер и зарегистрировать определенный экземпляр Type2 там.
Если у Вас есть класс с несколькими конструкторами, можно решить, какой конструктор используется контейнером Единицы использование атрибута "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)
{
}
}
Использовать фабрику.
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 разрешала только конструктор с одним параметром.