2017-10-10 81 views
0

我已經實現併爲我的測試用例實現了ODataControllerExtensions類。我選擇使用NSubstitue來模擬DbContext和Entities。如何爲Microsoft.OData.Edm.IEdmModel註冊服務類型

的問題是,當我試圖讓ODataPath

public static IQueryable<TResult> InvokeForTest<T, TResult>(this T controller, HttpMethod method, string entitySetName, string relativeSubPathUri, Func<T, ODataQueryOptions<TResult>, IQueryable<TResult>> expression) 
    where T : ODataController 
    where TResult : class 
{ 
    return controller.InvokeForTest(method, relativeSubPathUri, x => 
    { 
    var builder = new ODataConventionModelBuilder(); 
    builder.EnableLowerCamelCase(); 
    builder.EntitySet<TResult>(entitySetName); 
    IEdmModel model = builder.GetEdmModel(); 



    string pathString = string.Format("{0}{1}", entitySetName, relativeSubPathUri); 

    ODataPath path = new DefaultODataPathHandler().Parse("https://any//", pathString, new ResolverIndirection(controller.Configuration.DependencyResolver)); 

    var context = new ODataQueryContext(model, typeof(TResult), path); 
    var options = new ODataQueryOptions<TResult>(context, controller.Request); 

    // Run the expression. 
    return expression(x, options); 
    }); 
} 

,當我試圖讓IServiceProvider的

new ResolverIndirection(controller.Configuration.DependencyResolver) 

class ResolverIndirection : IServiceProvider 
    { 
     private readonly IDependencyResolver _resolver; 

     public ResolverIndirection(IDependencyResolver resolver) 
     { 
     _resolver = resolver; 
     } 

     public object GetService(Type serviceType) 
     { 
     return _resolver.GetService(serviceType); 
     } 
    } 

的例外,我得到的是問題出現。

System.InvalidOperationException:沒有爲'Microsoft.OData.Edm.IEdmModel'類型註冊服務。

我想知道是否有辦法註冊EdmlModel的服務類型。如果我以錯誤的方式回答這個問題,我會提出一些建議,告訴我如何做到這一點。

由於

回答

0

代替

新ResolverIndirection(controller.Configuration.DependencyResolver)

隨着

的IServiceProvider requestContainer = controller.Request.CreateRequestContainer(控制器。 Reque st.ODataProperties()RouteName)。

但在此之前,你必須註冊一個新的服務路線

HttpConfiguration配置= controller.Request.GetConfiguration(); config.MapODataServiceRoute(controller.Request.ODataProperties()。RouteName,「/」,model);

這就是最終來源的樣子。

返回controller.InvokeForTest(方法,relativeSubPathUri,X => {
變種助洗劑=新ODataConventionModelBuilder();
builder.EnableLowerCamelCase();
builder.EntitySet(entitySetName); IEdmModel模型= builder.GetEdmModel(); HttpConfiguration配置= controller.Request.GetConfiguration();
config.MapODataServiceRoute(controller.Request.ODataProperties()RouteName, 「/」,模型);

string pathString = $「{entitySetName} {relativeSubPathUri}」;
IServiceProvider requestContainer = controller.Request.CreateRequestContainer(controller.Request.ODataProperties()。RouteName); ODataPath path = new DefaultODataPathHandler()。解析(「https://any//」, pathString,requestContainer);

var context = new ODataQueryContext(model,typeof(TResult),path);
var options = new ODataQueryOptions(context, controller.Request);

//運行表達式。返回表達式(x,options); });