小编oli*_*iwa的帖子

使用WhenInjectedInto扩展方法绑定Ninject

我觉得我错过了一些明显的东西.我在这里阅读了几个相关的问题,我已经在Ninject的维基上阅读了更新的上下文绑定页面,但是它仍然不起作用.

我正在尝试改进使用工厂模式的遗留应用程序来使用Ninject.

我有1个接口(IInterface)由2个类(ClassB和ClassC)实现.IInterface有一个加载方法.在ClassB的加载方法中,它实例化ClassC然后执行它的加载方法.

基本上程序流是ClassA创建ClassB并执行load方法.在load方法中,ClassB创建了一些可以完成某些工作的ClassC.

我的绑定设置如此......

Bind<IInterface>().To<ClassC>().WhenInjectedInto<ClassB>();
Bind<IInterface>().To<ClassB>().WhenInjectedInto<ClassA>();
Run Code Online (Sandbox Code Playgroud)

当它运行时,它在ClassB的加载方法中失败并出现此错误...

激活IInterface时出错没有匹配的绑定可用,并且该类型不可自我绑定.

如果我尝试以下......

Bind<IInterface>().To<ClassC>().WhenInjectedInto<ClassB>();
Bind<IInterface>().To<ClassB>();
Run Code Online (Sandbox Code Playgroud)

它无限循环,永远不会创建ClassC.

编辑 我已将其简化为单元测试,但未给出我想要的结果...

[TestClass]
public class NinjectTestFixture
{
    private interface IDoSomething
    {
        void SaySomething();
    }

    private class ClassA : IDoSomething
    {
        public void SaySomething()
        {
            Console.WriteLine("Hello from Class A");
        }
    }

    private class ClassB : IDoSomething
    {
        private IKernel _Kernel;

        public ClassB(IKernel kernel)
        {
            _Kernel = kernel;
        }

        public void SaySomething()
        {
            Console.WriteLine("Hello from Class B");

            var x = _Kernel.Get<IDoSomething>();

            x.SaySomething();
        }
    }

    private class ClassC
    {
        private …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection ninject ninject-2

6
推荐指数
1
解决办法
3307
查看次数

Ninject + Web ApI 2:使用IFilterProvider到DefaultFilterProvider的绑定激活IFilterProvider时出错

我最初使用了一些自定义代码来处理Web API中的依赖项解析,它运行正常.我遇到的问题是我想将过滤器绑定到我的控制器范围,就像使用MVC一样.例如,Kernel.BindFilter.新的Ninject.We.WebApi包具有我想要的绑定扩展名,但是一旦我将它添加到我的项目中,我就会收到以下错误.我没有更改任何代码,只是引用DLL.

使用从IFilterProvider到DefaultFilterProvider的绑定激活IFilterProvider时出错在两个服务的构造函数之间检测到循环依赖.

激活路径:3)将依赖项IFilterProvider注入到DefaultFilterProviders类型的构造函数的参数defaultFilterProviders中2)将依赖项DefaultFilterProviders注入参数filterProviders类型为DefaultFilterProvider的构造函数1)请求IFilterProvider

建议:1)确保您未在​​任何服务实现上声明IFilterProvider的依赖项.2)考虑将服务组合成一个服务以消除周期.3)使用属性注入而不是构造函数注入,如果需要在注入属性值后运行初始化逻辑,则实现IInitializable.

at Ninject.Activation.Context.Resolve()at Ninject.KernelBase.<> c__DisplayClass15.b__f(IBinding binding)at System.Linq.Enumerable.WhereSelectListIterator 2.MoveNext() at System.Linq.Enumerable.<CastIterator>d__b11.MoveNext()at System.Linq.Enumerable.d__14 2.MoveNext() at System.Collections.Generic.List1..ctor(在System.Linq.Enumerable.d__14 1的System.Web.Http.Controllers.HttpActionDescriptor.b__0(IFilterProvider fp)的Ninject.Web.WebApi.Filter.DefaultFilterProvider.GetFilters(HttpConfiguration配置,HttpActionDescriptor actionDescriptor)中有IEnumerable 1源码. ctor(在System.Linq.Buffer 1源上的IEnumerable 1.d__0.MoveNext())在System.Linq.Enumerable.d__a0 1..ctor(System.Collections.Generic.List 1集合中的IEnumerable 1.MoveNext()) at System.Linq.Enumerable.ToList [TSource](IEnumerable 1.CreateValue()---从抛出异常的先前位置开始的堆栈跟踪结束---在System.Lazy的System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()处`1.get_Value()在System.Web.Http.Controllers.HttpActionDescriptor.GetFilterPipeline() 在System.Web.Http.Controller System.Web.Http上System.Web.Http.Dispatcher.HttpControllerDispatcher.SendAsyncCore(HttpRequestMessage请求,CancellationToken cancellationToken)的System.Web.Http.ApiController.ExecuteAsync(HttpControllerContext controllerContext,CancellationToken cancellationToken)中的s.HttpActionDescriptor.GetFilterGrouping(). Dispatcher.HttpControllerDispatcher.d__0.MoveNext()1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable
2.MoveNext() at System.Linq.Buffer1 source) at System.Linq.OrderedEnumerable1..ctor(IEnumerable1.MoveNext() at System.Web.Http.Controllers.HttpActionDescriptor.<RemoveDuplicates>d__3.MoveNext() at System.Linq.Buffer1 source) at System.Linq.Enumerable.<ReverseIterator>d__a01..ctor(IEnumerable
1 source) at System.Web.Http.Controllers.HttpActionDescriptor.InitializeFilterPipeline() at System.Lazy

ninject ninject-2 ninject-extensions

6
推荐指数
2
解决办法
2311
查看次数

您如何访问客户端的模型错误?

我不喜欢内置的 Html.ValidationSummary 助手,因为我希望在表单顶部显示一条消息,例如...

存在验证错误。无效字段已突出显示。

内置的 ValidationSummary 要么根本不输出任何内容,要么输出所有字段的列表。我只想要一个简洁的信息。

我的表单顶部有一个 div,按照我想要的方式设置样式,然后当页面加载时,我将以下方法挂接到表单上...

function CheckFormForValidationErrors() 
{
    if (!$("form").valid()) 
    {
        $(".validation-notification").css("visibility", "visible");
    }
}
Run Code Online (Sandbox Code Playgroud)

当客户端出现验证错误时,这非常有效。问题是当客户端验证成功但服务器端验证(例如登录表单)时。如果用户输入正确的用户名和密码,表单验证成功但登录失败。在服务器端,我添加了一个像这样的模型错误......

ModelState.AddModelError(string.Empty, "Login failed");
Run Code Online (Sandbox Code Playgroud)

但我不知道如何让消息显示在客户端上。如果您有更好的想法来实现我的目标,那么我愿意放弃我的想法并改变路线。我想做的事情不应该那么难。

jquery asp.net-mvc-3

5
推荐指数
2
解决办法
9267
查看次数