我有一個Web API項目,我試圖在運行時解析查詢處理程序,並給出查詢類型和查詢結果類型。以下是我用作概念驗證的一些測試代碼。我正在使用Ninject Factory擴展,但是我無法獲得正確的設置,因爲我想返回一個通用接口,也許這是錯誤的設計,所以任何建議都會很感激。嘗試使用Ninject Factory擴展解決依賴性時出錯
代碼
public interface IQueryHandlerFactory
{
IQueryHandler<IQuery, IQueryResult> Resolve(Type type);
}
public interface IQuery
{
}
public interface IQueryResult
{
}
public interface IQueryHandler<TQuery, TResult>
where TQuery : IQuery
where TResult : IQueryResult
{
TResult Execute(TQuery query);
}
public class PaymentQueryHandler : IQueryHandler<GetPayments, PaymentResult>
{
public PaymentResult Execute(GetPayments query)
{
throw new NotImplementedException();
}
}
public class UserQueryHandler : IQueryHandler<GetUsers, UserResult>
{
public UserResult Execute(GetUsers query)
{
throw new NotImplementedException();
}
}
public class TypeInstanceProvider : StandardInstanceProvider
{
protected override Type GetType(MethodInfo methodInfo, object[] arguments)
{
var type = arguments[0] as Type;
return type;
}
protected override IConstructorArgument[] GetConstructorArguments(MethodInfo methodInfo, object[] arguments)
{
return base.GetConstructorArguments(methodInfo, arguments).Skip(1).ToArray();
}
public override object GetInstance(IInstanceResolver instanceResolver, MethodInfo methodInfo, object[] arguments)
{
Type t = this.GetType(methodInfo, arguments);
var test = instanceResolver.Get(t,
null,
null,
this.GetConstructorArguments(methodInfo, arguments),
false);
return test;
}
}
我只是用一些Ninject測試調用我NinjectWebCommon現在,看看它是否會工作。我想能夠使用MakeGenericType
方法,因爲我知道查詢類型和結果類型。它的工作原理,當我打電話var test = kernel.Get(queryHandlerType);
然而,當我嘗試使用下面
NinjectWebCommon代碼工廠失敗:
kernel.Bind<IQueryHandlerFactory>().ToFactory(() => new TypeInstanceProvider());
var queryHandlerType = typeof(IQueryHandler<,>).MakeGenericType(typeof(GetPayments), typeof(PaymentResult));
var factory = kernel.Get<IQueryHandlerFactory>();
var test = kernel.Get(queryHandlerType); // This works
var handler = factory.Resolve(queryHandlerType); // This fails
所產生的誤差小於
Exception thrown: 'System.InvalidCastException' in DynamicProxyGenAssembly2
Additional information: Unable to cast object of type 'PaymentQueryHandler' to type 'IQueryHandler`2[IQuery,IQueryResult]'.
我很可能超過使事情變得複雜,或者這甚至有可能?我會這樣的。有沒有人有任何建議,讓這個工作?
您的解決方案將我指向正確的方向,謝謝 – Gavin