2014-11-03 5 views
0

Я пытаюсь получить Unity для разрешения типа (объекта) с использованием фабричного метода с параметром, но я не могу заставить это работать. Источник проблемы описан в этом ответе answer.InjectionFactory для именованного экземпляра

Он говорит, что я должен зарегистрировать каждый вид с:

m_Container.RegisterType<Object, View>("View"); 

В противном случае RequestNavigate («View») Метод потерпит неудачу, но я не люблю этот подход. Я не буду перемещаться с помощью RequestNavigate ("Namespace.View"), но это не сработает.

Так я пытался сказать контейнер Unity, как решить взгляды:

this.Container.RegisterType<object>(new InjectionFactory(this.ViewObjectFactory)); 

private object ViewObjectFactory(IUnityContainer iUnityContainer, Type type, string name) 
{ 
    //Never called 
} 

Но если Контейнер вызывается со следующими параметрами:

this.Container.Resolve(typeof(object), "Namespace.View"); 

получает создания объекта и завода метод игнорируется, как я могу получить единство, чтобы вызвать фабричный метод для типа (даже если метод разрешения вызывается с именем).

ответ

1

Когда призма разрешает представление, используя названную регистрацию. У вас есть метод заводской инъекции при неименованной регистрации. Я не верю, что есть способ сообщить единство, чтобы разрешить неименованную регистрацию при разрешении названного. Вы можете связать их с общим, но это не поможет вам, поскольку вам все равно нужно будет назвать их всех. Если вы действительно просто хотите использовать пространство имен, вы можете просто зарегистрировать полное имя в качестве имени.

Я хотел бы сделать метод расширения, чтобы справиться с этим для меня

public static IUnityContainer RegisterView<TView>(this IUnityContainer container) 
{ 
    return container.RegisterType<object, TView>(typeof (TView).FullName); 
} 

Вы могли бы использовать его в качестве

m_Container.RegisterView<View>(); 

Тогда для призмы вам нужно будет изменить запрос для навигации всегда проходят в полное имя представления. Опять же я хотел бы сделать метод расширения для тех

public static void RequestNavigate<TView>(this IRegion region) 
{ 
    region.RequestNavigate(new Uri(typeof (TView).FullName, UriKind.Relative)); 
} 

public static void RequestNavigate<TView>(this IRegionManager region, string regionName) 
{ 
    region.RequestNavigate(regionName, new Uri(typeof (TView).FullName, UriKind.Relative)); 
} 

В коде вы будете использовать его как

region.RequestNavigate<View>(); 

или

regionManager.RequestNavigate<View>("Main"); 

Есть 6 других перегруженных для RequestNavigate, что вам нужно будет создайте методы расширения, если вы их использовали, и хотели использовать его таким образом.

Смежные вопросы