标签: ninject

.NET Web Api 2.1中Ninject绑定的无参数构造函数错误

目前正在编写API站点(.NET Web Api 2.1)

对于我们以前的API站点,我们使用了Ninject.MVC3包并手动连接了依赖项解析器和范围,并根据建议将我们的逻辑插入到NinjectWebCommon中.

这导致我们的新项目出现胃灼热,无参数构造函数错误.在过去,这是一个死的赠品,我们没有正确地连接Web Api中的依赖性解析器.只有这一次,我们是.它就在那里.

var resolver = new NinjectDependencyResolver(kernel);
GlobalConfiguration.Configuration.DependencyResolver = resolver;
Run Code Online (Sandbox Code Playgroud)

所以我有点失落.在上周,我看到Ninject已更新,WebAPI nuget包已复活,因此我决定尝试实施.

我安装了NuGet包Ninject.Web.WebApi(版本3.2).这似乎不包括应用绑定的NinectWebCommon.cs文件.它只添加了必要的组件.做一些挖掘我偶然发现了这个实现.

https://gist.github.com/odytrice/5842010

(我不清楚Nuget包是否正在为我做这个,这都是冗余代码.如果是这样,那很好,我只需要了解如何使用nuget包添加我们的绑定.)

除了加载模块之外,我在线上实现了这一行,我将三个单独的模块加载为测试.

public static INinjectModule[] Modules
{
    //get { return new INinjectModule[] { new MainModule() }; }
    get { return new INinjectModule[] { new GlobalModule(), new InventoryModule(), new StoreModule() }; }
    }
Run Code Online (Sandbox Code Playgroud)

我已经验证了使用这个新代码设置了依赖项解析器.

_resolver = new NinjectHttpResolver(modules);
GlobalConfiguration.Configuration.DependencyResolver = _resolver;
Run Code Online (Sandbox Code Playgroud)

但问题仍然存在.

ExceptionMessage:

An error occurred when trying to create a controller of type 'StoreSearchController'.
Make sure that the controller has a …
Run Code Online (Sandbox Code Playgroud)

.net c# ninject asp.net-web-api

22
推荐指数
1
解决办法
1万
查看次数

何时使用Ninject和MongoDB使用Singleton vs Transient vs Request

当我在global.cs文件中进行绑定时,我不太确定何时应该使用SingletonScope()vs TransientScope()vs RequestScope().

我有一个例如我对MongoSession的调用(使用NoRM和mvcStarter项目http://mvcstarter.codeplex.com/)设置为SingletonScope但是我创建了一个使用这个MongoSession对象的存储库来更容易地调用Mongo,例如,我有一个NewsRepository,它使用MongoSession从数据中获取我的新闻项.作为一个例子,我有一个调用,它获取DisplayOnHome设置为true的新闻项目,并获取CreationDate的最新信息.这样的存储库应该是SingletonScope还是RequestScope会更合适?

我什么时候应该使用它们?为什么?

c# asp.net-mvc ninject mongodb norm

21
推荐指数
1
解决办法
2万
查看次数

Ninject是否支持Func(自动生成工厂)?

Autofac自动生成工厂Func<T>; 我甚至可以传递参数.

public class MyClass
{
    public MyClass(Func<A> a, Func<int, B> b)
    {
        var _a = a();
        var _b = b(1);
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以和Ninject一样吗?如果没有,我可以申请哪种解决方法?

谢谢.

更新:

刚发现这篇帖子,似乎答案是否定的:

如何使用Ninject处理带静态方法的类?

ninject func autofac

21
推荐指数
1
解决办法
5179
查看次数

MVC 3 - 如何实现服务层,我是否需要存储库?

我目前正在使用EF Code First,SQL CE和Ninject构建我的第一个MVC 3应用程序.我已经阅读了很多关于使用存储库,工作单元和服务层的信息.我想我已经完成了基础知识,并且我已经完成了自己的实现.

这是我目前的设置:

实体

public class Entity
{
    public DateTime CreatedDate { get; set; }
    public Entity()
    {
        CreatedDate = DateTime.Now;
    }
}

public class Profile : Entity
{
    [Key]
    public Guid UserId { get; set; }
    public string ProfileName { get; set; }

    public virtual ICollection<Photo> Photos { get; set; }

    public Profile()
    {
        Photos = new List<Photo>();
    }

public class Photo : Entity
{
    [Key]
    public int Id { get; set; }
    public Guid FileName …
Run Code Online (Sandbox Code Playgroud)

c# design-patterns entity-framework ninject asp.net-mvc-3

21
推荐指数
1
解决办法
6202
查看次数

Autofac相当于Ninject的WhenInjectedInto()

所以我们正在努力将一些项目从Ninject转换为Autofac,我们偶然发现了Ninject中非常简洁的东西,我们无法弄清楚如何在Autofac中做到这一点.在我们的应用程序中,我们有一个名为的接口ISession,它以两种不同的具体类型实现.一个进入Oracle数据库,另一个进入MS-SQL数据库.

我们的MVC应用程序中有控制器,它们只需要一个ISession的具体实现,基于它们被注入哪个控制器.例如:

Bind<IFoo>().To<Foo1>();
Bind<IFoo>().To<Foo2>().WhenInjectedInto<OracleController>();
Run Code Online (Sandbox Code Playgroud)

我的问题是:我们如何在Autofac中实现相同的结果?何时IFoo注入任何控制器,Foo1应默认提供,但在一个特殊情况下,我们需要Foo2.

在此先感谢您的帮助!

dependency-injection ninject inversion-of-control autofac asp.net-mvc-3

21
推荐指数
1
解决办法
2427
查看次数

使用Ninject获取对象的实例

我通过Nuget 在我的项目Ninject.MVC3上安装了.

我读到这篇文章,为了在我的控制器中注入依赖项,你所要做的就是安装Ninject,在NinjectMVC3.cs中添加我的依赖项并准备就绪.

到目前为止这么好,但如何检索对象的实例?

public ActionResult MyAction()
{
    var myObject = /* HERE  ??*/
}
Run Code Online (Sandbox Code Playgroud)

在控制器的构造函数中我没有问题!

public class AccountController : Controller
{
    public AccountController(IRepository repository) { ... } //This works!!
}
Run Code Online (Sandbox Code Playgroud)

dependency-injection ninject asp.net-mvc-3

21
推荐指数
1
解决办法
1万
查看次数

如何在Ninject中绑定Generic类型的接口

我是Ninject的新手,在我实现通用存储库模式时发现自己陷入困境.我想将依赖关系IRepository <IEntityType>绑定到类ConcreteRepository <EntityType>,其中ConcreteRepository <T>实现IRepository <T>,EntityType实现IEntityType.我试过这个:

kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<EntityType>>();
Run Code Online (Sandbox Code Playgroud)

...但是Ninject不会接受它,因为它不知道或不关心EntityType实现IEntityType.我怎样才能绑定这种依赖?

UPDATE

这是我得到的错误:

错误3类型'ICM.Dependency.Repository.ConcreteRepository'不能在泛型类型或方法'Ninject.Syntax.IBindingToSyntax.To()'中用作类型参数'TImplementation'.没有从"ConcreteRepository <EntityType>"到"IRepository <IEntityType>"的隐式引用转换.

我仍然不太明白为什么我的绑定不起作用,但显然我在那里错误地使用泛型.因此,该解决方案与NInject无关.我结束了指定ConcreteRepository以显式连接IEntityType和TEntityType:

public class ConcreteRepository<TInterface, TEntity> : IRepository<TInterface> where TEntity : TInterface { ... }
Run Code Online (Sandbox Code Playgroud)

然后注射可写如下:

kernel.Bind<IRepository<IEntityType>>().To<ConcreteRepository<IEntityType,EntityType>>()
Run Code Online (Sandbox Code Playgroud)

c# generics dependency-injection ninject generic-interface

21
推荐指数
1
解决办法
2万
查看次数

当我转向依赖注入时,使用语句会发生什么

我目前正在使用以下代码:

public class MyProvider
{
    public MyProvider()
    {
    }

    public void Fetch()
    {
        using (PopClient popClient = new PopClient())
        {
            ....
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

因为我希望能够对Fetch方法进行单元测试,并且由于我无法模拟PopClient,所以我创建了一个接口和一个调用PopClient的包装类.我更新的代码如下:

public class MyProvider
{
    private readonly IPopClient popClient;

    public MyProvider(IPopClient popClient)
    {
        this.popClient = popClient;
    }

    public void Fetch()
    {
        using (var pop3 = popClient)
        {
            ....
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我使用Ninject进行依赖注入,我不太确定using语句在更新的代码中会产生什么样的影响,因为Ninject已经创建了一个PopClient实例并将其注入到构造函数中.

using语句是否会处理pop3对象并单独保留popClient对象,以便Ninject可以处理它或者using语句是否会干扰Ninject?

在这种情况下,正确的方法是什么?任何见解都会非常有帮助.

c# dependency-injection ninject

21
推荐指数
1
解决办法
2621
查看次数

无法加载文件或程序集"System.Web.Mvc,Version = 3.0.0.0"或其依赖项之一

我在包管理器控制台中使用以下命令在MVC项目中添加Ninject:

Install-Package Ninject -version 3.0.1.10
Install-Package Ninject.Web.Common -version 3.0.0.7
Install-Package Ninject.MVC3 -Version 3.0.0.6
Run Code Online (Sandbox Code Playgroud)

当我运行应用程序时,我得到这样的错误:

无法加载文件或程序集'System.Web.Mvc,Version = 3.0.0.0,Culture = neutral,PublicKeyToken = 31bf3856ad364e35'或其依赖项之一.定位的程序集的清单定义与程序集引用不匹配.(HRESULT异常:0x80131040)

c# asp.net-mvc ninject

21
推荐指数
2
解决办法
7万
查看次数

如何拦截所有ASP.NET WebApi控制器操作方法调用Ninject拦截进行日志记录?

每次调用ASP.NET WebApi控制器的一个操作方法时,我们公司都需要记录某些内容.由于我们现在使用Ninject作为DI,我们也想将它用于此目的.这是我到目前为止所尝试的.

我有通过NuGet安装的Ninject,Ninject.Extensions.Interception和Ninject.Extensions.Interception.DynamicProxy,我有以下模块

public class InterceptAllModule : InterceptionModule
{
    public override void Load()
    {
        Kernel.Intercept(p => p.Request.Service.Name.EndsWith("Controller")).With(new TimingInterceptor());
    }
}
Run Code Online (Sandbox Code Playgroud)

TimingInterceptor的位置

public class TimingInterceptor : SimpleInterceptor
{
    readonly Stopwatch _stopwatch = new Stopwatch();
    protected override void BeforeInvoke(IInvocation invocation)
    {
        _stopwatch.Start();
    }

    protected override void AfterInvoke(IInvocation invocation)
    {
        _stopwatch.Stop();
        string message = string.Format("[Execution of {0} took {1}.]",invocation.Request.Method,_stopwatch.Elapsed);
        Log.Info(message + "\n");
        _stopwatch.Reset();
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我尝试使用ninject内核挂起模块时,运行我的站点

var kernel = new StandardKernel(new InterceptAllModule());
Run Code Online (Sandbox Code Playgroud)

但是,只要有一个调用进入其中一个操作方法,它就会抛出一个错误说

Cannot instantiate proxy of class: MyApiController.
Run Code Online (Sandbox Code Playgroud)

有经验的人可以指出我做错了吗?谢谢.

asp.net-mvc logging ninject ninject-interception asp.net-web-api

20
推荐指数
1
解决办法
2万
查看次数