从什么dll我可以获得拦截的扩展?我从http://github.com/danielmarbach/ninject.extensions.interception添加了Ninject.Extensions.Interception .那里没有运气.有一些样品有效吗?
我需要的是制作一个拦截器,它将从WcfClient传递到WcfServer一个具有不同参数的不同函数,这样我就不必在WcfServer代码后面实现已经实现的函数了.所以我已经实现的功能的签名是 -
public static T InvokeService<T>(MethodInfo MethodName, Type genericType, Type BlClass, params object[] ParamList)
Run Code Online (Sandbox Code Playgroud)
它的作用是通过BlClass激活Method并向其发送ParamList.我想制作一个拦截器,它将动态填充参数,同时解决WcfServer方面的问题.但首先我如何才能访问我的ninjectModule中的Intercept扩展?
在此先感谢您提供的任何帮助:)
ps试过:
using Ninject.Extensions.Interception;
Run Code Online (Sandbox Code Playgroud)
和:
using Ninject.Core;
using Ninject.Core.Interception;
Run Code Online (Sandbox Code Playgroud) 我有下课
public class Foo
{
public Foo(int max=2000){...}
}
Run Code Online (Sandbox Code Playgroud)
我想使用Ninject为Foo注入一个常量值.我试过这个
Bind<Foo>().ToSelft().WithConstructorArgument("max", 1000);
Run Code Online (Sandbox Code Playgroud)
但是当我尝试使用时出现以下错误_ninject.Get<Foo>:
Error activating int
No matching bindings are available, and the type is not self-bindable.
Activation path:
3) Injection of dependency int into parameter max of constructor of type Foo
Run Code Online (Sandbox Code Playgroud) 肯定会有一些我忽视的东西 - 通常是我遇到这样的问题.
我有一个控制器只是根据提供的ID返回一篇新闻文章:
[HandleError]
public class HomeController : Controller
{
private readonly IArticleRepository articleRepository;
public HomeController(IArticleRepository Repository)
{
articleRepository = Repository;
}
public ActionResult Index()
{
return View("Index");
}
// Here's the bit we're interested in
public ActionResult Article(int id)
{
var article = articleRepository.GetById(id);
return View("Article", article);
}
}
Run Code Online (Sandbox Code Playgroud)
我正在使用Moq嘲笑这个:
[TestFixture]
public class HomeControllerTests
{
HomeController controller;
int articleId;
Article model;
[TestFixtureSetUp]
public void SetupMethods()
{
Mock<IArticleRepository> repositoryMock = new Mock<IArticleRepository>();
repositoryMock.Setup(x => x.GetById(articleId)).Returns(GetSampleArticle());
controller = new HomeController(repositoryMock.Object); …Run Code Online (Sandbox Code Playgroud) 我有一个看起来像这样的绑定:
kernel.Bind<IRepository<Holiday>>().To<RepositoryBase<Holiday>>();
Run Code Online (Sandbox Code Playgroud)
问题是RepositoryBase采用了一个名为context的UnitOfWork的构造函数参数.这不是,本身就是一个问题.Ninject应该解决它.除了我有两个UnitOfWork实现的事实,两个都使用属性鉴别器绑定.
kernel.Bind<IUnitOfWork>().To<MS_DevEntities>().WhenTargetHas<MsDataAttribute>()
.InRequestScope();
Run Code Online (Sandbox Code Playgroud)
如何指定在创建IRepository时,应该使用MS_DevEntities创建?
当然,我可以这样做:
kernel.Bind<IRepository<Holiday>>().To<RepositoryBase<Holiday>>()
.WithConstructorArgument("context", new MS_DevEntities());
Run Code Online (Sandbox Code Playgroud)
但是,我宁愿让Ninject创建实例,特别是因为我正在使用.InRequestScope()生命周期.
有什么建议?
编辑:
以前,我使用的是如下所示的类:
public class HolidayRepository : RepositoryBase<Holiday>, IHolidayRepository
{
public HolidayRepository([MsData]IUnitOfWork context) : base(context){}
}
Run Code Online (Sandbox Code Playgroud)
但是,我现在发现自己有几十个,但是当我需要创建一个新的存储库时,它们并没有做太多工作,而是增加了额外的工作.我想直接在绑定中映射这些.
EDIT2:
我想我可以做这样的事情,但看起来有点像黑客.有没有更好的办法?
kernel.Bind<MS_DevEntities>().ToSelf().InRequestScope();
kernel.Bind<IRepository<Holiday>>().To<RepositoryBase<Holiday>>()
.WithConstructorArgument("context",
(context) => context.Kernel.Get<MS_DevEntities>());
Run Code Online (Sandbox Code Playgroud)