protected override IPresenter CreatePresenterInstance(Type presenterType, TypedPageData pageData, Type viewType, IEPiView view) { // Unfortunately, Ninject needs the bloody names of the parameters, // so we need to figure them out by reflecting. string pageDataParameterName = null; string viewParameterName = null; foreach (var constructor in presenterType.GetConstructors()) { var constructorParameters = constructor.GetParameters(); foreach (var parameter in constructorParameters) { if (parameter.ParameterType.IsAssignableFrom(pageData.GetType())) pageDataParameterName = parameter.Name; if (parameter.ParameterType.IsAssignableFrom(view.GetType())) viewParameterName = parameter.Name; } } var parameters = new IParameter[] { new ConstructorArgument(viewParameterName, view), new ConstructorArgument(pageDataParameterName, pageData) }; return (IPresenter)Kernel.Get(presenterType, parameters); }
/// <summary> /// Create a presenter instance without the pageData parameter /// </summary> protected override IPresenter CreatePresenterInstance(Type presenterType, Type viewType, IEPiView view) { if (presenterType == (Type) null) throw new ArgumentNullException("presenterType"); if (viewType == (Type) null) throw new ArgumentNullException("viewType"); if (view == null) throw new ArgumentNullException("view"); Dictionary<string, object> dictionary = new Dictionary<string, object>() { { "view", (object) view } }; return (IPresenter) this.presenterKernel.Resolve(presenterType, (IDictionary) dictionary); }
protected override IPresenter CreatePresenterInstance(Type presenterType, TypedPageData pageData, Type viewType, IEPiView view) { ConstructorInfo constructorToUse = null; var constructors = presenterType.GetConstructors(); foreach (var constructor in constructors) { if (CanUseConstructor(constructor, viewType, GetPageDataType(view))) { constructorToUse = constructor; break; } } ParameterInfo[] parameters = constructorToUse.GetParameters(); object[] constructorParametersToUse = new object[parameters.Length]; constructorParametersToUse[0] = view; constructorParametersToUse[1] = view.CurrentPage; for (int i = 2; i < constructorParametersToUse.Length; i++) { constructorParametersToUse[i] = ResolveParameter(parameters[i].ParameterType, i, view); } return (IPresenter)Activator.CreateInstance(presenterType, constructorParametersToUse); }
protected virtual object ResolveParameter(Type parameterType, int parameterIndex, IEPiView view) { return container.GetInstance(parameterType); }
protected virtual IPresenter CreatePresenterInstance(Type presenterType, Type viewType, IEPiView view) { return (IPresenter) Activator.CreateInstance(presenterType, new object[] {view}); }
protected Type GetPageDataType(IEPiView epiView) { var pageDataType = epiView.CurrentPage.GetType(); // when PageTypeBuilder is at work, the PageData will be a proxy object. In this case, get the base class. var isProxyObject = pageDataType.ToString().ToLower().Contains("proxy"); if (isProxyObject) pageDataType = pageDataType.BaseType; return pageDataType; }