我正在尝试将新的ASP.Net MVC 4 Web API项目模板与Ninject一起使用,但是在以下错误中遇到了障碍:
从程序集'Ninject.Web.WebApi,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = c7192dc5380945e7'类型'Ninject.Web.WebApi.Filter.DefaultFilterProvider'中的方法'GetFilters'没有实现.
我正在使用ASP.Net MVC 4 - > Web API模板在Visual Studio 2010中创建一个全新的项目,我正在使用最新的Ninject NuGet包:
我尝试了这个问题中提出的解决方案,但是我没有运气 - 如果我删除对Ninject.Web.WebApi的引用,那么MVC永远不会使用Ninject.我也注意到他们提到了Ninject.MVC3但是我使用的是新的Ninject.WebApi插件.
我正在使用NinjectWebCommon.cs中的默认绑定代码,该代码是在NuGet安装期间创建的,并尝试在RegisterServices()中注册一个简单服务
[assembly: WebActivator.PreApplicationStartMethod(typeof(mkts.web.App_Start.NinjectWebCommon), "Start")]
[assembly: WebActivator.ApplicationShutdownMethodAttribute(typeof(mkts.web.App_Start.NinjectWebCommon), "Stop")]
namespace mkts.web.App_Start
{
using System;
using System.Web;
using Microsoft.Web.Infrastructure.DynamicModuleHelper;
using Ninject;
using Ninject.Web.Common;
using mkts.service;
public static class NinjectWebCommon
{
private static readonly Bootstrapper bootstrapper = new Bootstrapper();
/// <summary>
/// Starts …Run Code Online (Sandbox Code Playgroud) 我正在组建一个小团队,设计一个流程管理系统,供同一行业内的几个不同客户使用.系统的目标和客户的高级要求非常相似.然而,正如预期的那样 - 一旦我们开始深入挖掘他们的个人需求,我们最终需要为每个客户提供一些非常广泛的定制,包括数据,输入表格,验证,工作流程,报告等.
加上所有这些,我们意识到多租户架构可能是实现这一目标的最佳方法.后端远远超出设计范围,是使用ServiceStack,RavenDB和Sql Server构建的.net中的RESTful api.任何熟悉ServiceStack的人都会知道它非常灵活,并且在构建时考虑了可插拔性 - 这使得实现多租户REST api比我们预期的要容易得多.我们使用一个非常简单的约定来通过检查属于每个请求的会话中的值来识别和授权租户(所有"特定于租户的"请求必须经过身份验证,因此始终有可用的会话).因此,目前很少或根本不需要在任何路由URL中跟踪或传递来自客户端的租户ID.因此,对于后端api,我们的设计目标是拥有一个代码库,支持不同的客户,具有大量的代码重用和灵活性,可根据需要自定义/扩展租户特定的功能.
所以后端大部分都是平方的,我们把注意力转移到前端,我们真的很难在AngularJS中实现类似的多租户方法.部分问题在于我们对角度相对较新.我们有一些使用标准"文件夹模式"构建单用途应用程序的经验,但是当我们在这里查看我们的多租户要求时,我们真的很难将所有内容联系在一起(一般项目结构/路由/视图)以支持相同的多我们通过后端实现的AngularJS中的设计目标(支持重用,灵活性和定制的单一代码库).该模块模式似乎是一个很好的选择每个租户的定制功能,但我们仍然缺少大的事情是一个整体的架构方法,为我们提供一个单一的AngularJS代码库支持上述目标,"插上".任何AngularJS专业人士都可以帮助我们超越驼峰并在这里推荐一种方法吗?
谢谢!
我正在使用Ninject Factory Extension将简单的对象工厂注入我的服务类.
这是我的界面和两个实现它的类:
public interface ICar
{
void Drive();
void Stop();
}
public class Mercedes : ICar
{
public void Drive()
{
Do mercedes drive stuff...
}
public void Stop()
{
Do mercedes stop stuff...
}
}
public class Ferrari : ICar
{
public void Drive()
{
Do ferrari drive stuff...
}
public void Stop()
{
Do ferrari stop stuff...
}
}
Run Code Online (Sandbox Code Playgroud)
这是我在运行时动态创建汽车的对象工厂:
public interface ICarFactory
{
ICar CreateCar(string carType);
}
public class CarFactory : ICarFactory …Run Code Online (Sandbox Code Playgroud)
介绍
我的应用程序使用方法链实例化一个对象,因此它的生成和配置如下:
var car = new Car("Ferrari").Doors(2).OtherProperties(x = x.Color("Red"));
Run Code Online (Sandbox Code Playgroud)
问题
我需要在运行时动态生成此对象 - 配置所需的链接方法将在运行时确定,因此必须动态地动态组装所有内容.我过去曾经使用过反射来创建简单的对象new Car("Ferrari", 2, "Red")- 我很酷 - 但是从来没有任何包含lambda表达式作为参数的链式方法 - 这两个因素确实让我陷入困境.我已经查看了表达式树,并且相信这是创建动态表达式参数的解决方案的一部分,但我完全陷入困境,试图弄清楚如何将它与反射一起缝合以创建基础对象和其他链式方法.
谢谢和赞赏
提前花时间查看我的问题以及您可能提供的任何指导或信息.
更新:结论
非常感谢dasblinkenlight和Jon Skeet的回答.我选择了dasblinkenlight的答案,因为他的代码示例让我立即开始运行.对于方法链接,我基本上在接受的答案中使用相同的循环方法,所以我不会重复该代码,但下面是我编写的代码,动态地将表达式树方法调用转换为动作委托,然后可以通过反射执行,Invoke()如dasblinkenlight的回答.正如乔恩指出的那样,这确实是问题的症结所在.
Helper类存储方法元数据.
public struct Argument
{
public string TypeName;
public object Value;
}
public class ExpressionTreeMethodCall
{
public string MethodName { get; set; }
public IList<Argument> Arguments { get; set; }
public ExpressionTreeMethodCall()
{
Arguments = new List<Argument>();
}
}
Run Code Online (Sandbox Code Playgroud)
用于组装lambda表达式方法调用的静态方法,然后将其作为要在其他位置执行的操作委托返回(Invoke()在我的情况下作为参数传递).
public static Action<T> ConvertExpressionTreeMethodToDelegate<T>(ExpressionTreeMethodCall methodData)
{
ParameterExpression type …Run Code Online (Sandbox Code Playgroud) c# ×3
.net ×2
ninject ×2
angularjs ×1
expression ×1
factory ×1
lambda ×1
multi-tenant ×1
reflection ×1