标签: ninject-2

MVC 3:如何学习如何使用NUnit,Ninject和Moq进行测试?

我的问题的简短版本:

  1. 任何人都可以指向一些好的,详细的资源,我可以从中学习如何使用NUnit,Ninject 2和Moq在我的MVC 3应用程序中实现测试?
  2. 这里的任何人都可以帮我澄清一下Controller-Repository解耦,模拟和依赖注入是如何协同工作的吗?

我的问题的更长版本:

我想做什么......

我目前正在开始创建一个MVC 3应用程序,它将使用Entity Framework 4,使用数据库第一种方法.我想这样做,所以我试图设计类,层等,以便高度可测试.但是,除了对它们的学术理解之外,我对单元测试或集成测试几乎没有经验.

经过大量的研究,我决定使用

  • NUnit作为我的测试框架
  • Ninject 2作为我的依赖注入框架
  • Moq是我的嘲弄框架.

我知道哪个框架最好的主题,等等,可以进入这个,但在这一点上,我真的不知道任何一个形成一个坚实的意见.所以,我决定采用这些免费的解决方案,这些解决方案似乎很受欢迎并且维护得很好.

到目前为止我学到了什么......

我花了一些时间研究这些东西,阅读资源,如:

从这些资源中,我已经设法满足了对存储库模式的需求,以及存储库接口,以便分离我的控制器和数据访问逻辑.我已经在我的应用程序中写了一些内容,但我承认我不清楚整个事情的机制,以及我是否正在进行这种解耦以支持模拟或依赖注入,或两者兼而有之.因此,我当然不介意听到你这些人的意见.在这一点上我可以获得的任何清晰度都会对我有所帮助.

对我来说事情变得浑浊......

在我开始尝试绕过Ninject之前,我认为我已经很好地掌握了这些东西,如上面引用的构建可测试的ASP.NET MVC应用程序中所述.具体来说,我完全迷失了作者开始描述服务层实现的程度,大约是文档的一半.

无论如何,我现在正在寻找更多的资源来学习,以便尝试围绕这些东西获得各种观点,直到它开始对我有意义.

总结所有这些,将其归结为具体问题,我想知道以下内容:

  1. 任何人都可以指向一些好的,详细的资源,我可以从中学习如何使用NUnit,Ninject 2和Moq在我的MVC 3应用程序中实现测试?
  2. 这里的任何人都可以帮我澄清一下Controller-Repository解耦,模拟和依赖注入是如何协同工作的吗?

编辑:

我刚刚在Github上发现了Ninject官方维基,所以我将开始研究它是否开始为我澄清事情.但是,我仍然对SO社区对所有这些的想法非常感兴趣:)

nunit unit-testing moq ninject-2 asp.net-mvc-3

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

Ninject:使用Ninject注册已创建的实例?

任何人都可以告诉我是否可以使用Ninject注册已经创建的类实例,以便每次需要注入时它都会使用此实例?

我想你可以称之为单身,但我已经创建了实例.所有文档都指向创建类的新实例.

dependency-injection ninject ninject-2

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

Ninject InRequestScope缺失

关于ninject的最新版本(2.2.1.4)有几个问题.

试图将Linq2sql绑定DataContext到具体实现InRequestScope(在类库项目中)

Bind<DataContext>().To<MoneywatchDataContext>()
Run Code Online (Sandbox Code Playgroud)

但找不到InRequestScope方法

在此输入图像描述

最后这样做,

Bind<DataContext>().To<MoneywatchDataContext>().InScope(ctx => HttpContext.Current)
Run Code Online (Sandbox Code Playgroud)

只是想知道是否:

  1. 如果它的行为与InRequestScopeMethod 完全相同.
  2. 它将保证当我HTTContext.Current的GC被用时,底层DataCotext也将被处理掉.

c# binding ninject ninject-2

34
推荐指数
3
解决办法
7521
查看次数

Ninject:如何使用多个类型参数绑定开放泛型?

我正在使用Ninject 2.2,我正在尝试为一个带有两个类型参数的开放泛型设置绑定.根据此答案由QES,结合正确的语法IRepository<T>Repository<T>是这样的:

Bind(typeof(IRepository<>)).To(typeof(Repository<>));
Run Code Online (Sandbox Code Playgroud)

如果IRepository仅使用一个类型参数,则上述语法可以正常工作,但如果需要更多,则会中断(给出Using the generic type 'Repository<T,U>' requires 2 type arguments编译时错误.)

我怎样才能结合IRepository<T,U>Repository<T,U>

谢谢.

c# ninject-2

24
推荐指数
1
解决办法
4377
查看次数

Ninject WithConstructorArgument:没有匹配的绑定可用,并且该类型不可自绑定

我对WithConstructorArgument的理解可能是错误的,因为以下内容不起作用:

我有一个服务,让我们称之为MyService,其构造函数采用多个对象,以及一个名为testEmail的字符串参数.对于此字符串参数,我添加了以下Ninject绑定:

string testEmail = "test@example.com";
kernel.Bind<IMyService>().To<MyService>().WithConstructorArgument("testEmail", testEmail);
Run Code Online (Sandbox Code Playgroud)

但是,在执行以下代码行时,我得到一个异常:

var myService = kernel.Get<MyService>();
Run Code Online (Sandbox Code Playgroud)

这是我得到的例外:

激活字符串时出错没有匹配的绑定可用,并且该类型不可自我绑定.激活路径:
2)将依赖字符串注入到MyService类型的构造函数的参数testEmail中
1)请求MyService

建议:
1)确保已为字符串定义了绑定.
2)如果在模块中定义了绑定,请确保已将模块加载到内核中.
3)确保您没有意外创建多个内核.
4)如果使用构造函数参数,请确保参数名称与构造函数参数名称匹配.
5)如果使用自动模块加载,请确保搜索路径和过滤器正确无误.

我在这做错了什么?

更新:

这是MyService构造函数:

[Ninject.Inject]
public MyService(IMyRepository myRepository, IMyEventService myEventService, 
                 IUnitOfWork unitOfWork, ILoggingService log,
         IEmailService emailService, IConfigurationManager config,
         HttpContextBase httpContext, string testEmail)
{
    this.myRepository = myRepository;
    this.myEventService = myEventService;
    this.unitOfWork = unitOfWork;
    this.log = log;
    this.emailService = emailService;
    this.config = config;
    this.httpContext = httpContext;
    this.testEmail = testEmail;
}
Run Code Online (Sandbox Code Playgroud)

我有所有构造函数参数类型的标准绑定.只有'string'没有绑定,而HttpContextBase的绑定有点不同:

kernel.Bind<HttpContextBase>().ToMethod(context => new HttpContextWrapper(new HttpContext(new MyHttpRequest("", "", "", …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection exception-handling ninject ninject-2

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

使用Ninject将存储库注入自定义成员资格提供程序

我正在尝试使用MVC 3中的ninject将存储库注入自定义成员资格提供程序.

在MembershipProvider中,我尝试了以下内容:

[Inject]
public ICustomerRepository _customerRepository{ get; set; }
Run Code Online (Sandbox Code Playgroud)

[Inject]
public TUMembershipProvider(ICustomerRepository customerRepository)
{
    _customerRepository = customerRepository;
}
Run Code Online (Sandbox Code Playgroud)

在我的ninject模块中,我尝试了以下方法:

Bind<MembershipProvider>().ToConstant(Membership.Provider);
Run Code Online (Sandbox Code Playgroud)

以上都不是.

当我使用(在global.asa)

kernel.Inject(Membership.Provider);
Run Code Online (Sandbox Code Playgroud)

和...一起

[Inject]
public ICustomerRepository _customerRepository{ get; set; }
Run Code Online (Sandbox Code Playgroud)

它有效,但我没有生命周期管理,这将导致NHibernate的"ISession is open"错误,因为ISession是InRequestScope而存储库不是.

asp.net-mvc ninject-2 asp.net-mvc-3

18
推荐指数
2
解决办法
3871
查看次数

ASP.NET MVC 3:具有继承/多态的DefaultModelBinder

首先,对于大帖子(我先尝试做一些研究)和同一问题的混合技术(ASP.NET MVC 3,Ninject和MvcContrib),我感到很遗憾.

我正在使用ASP.NET MVC 3开发一个项目来处理一些客户端订单.

简而言之:我有一些继承自和抽象类的对象,Order当我向控制器发出POST请求时,我需要解析它们.我该如何解决正确的类型?我是否需要覆盖DefaultModelBinder该类,或者还有其他方法可以执行此操作?有人可以提供一些代码或其他链接,如何做到这一点?任何帮助都会很棒!如果帖子令人困惑,我可以做任何改变以表明清楚!

所以,对于我需要处理的订单,我有以下继承树:

public abstract partial class Order {

    public Int32 OrderTypeId {get; set; }

    /* rest of the implementation ommited */
}

public class OrderBottling : Order { /* implementation ommited */ }

public class OrderFinishing : Order { /* implementation ommited */ }
Run Code Online (Sandbox Code Playgroud)

这些类都是由Entity Framework生成的,所以我不会修改它们,因为我需要更新模型(我知道我可以扩展它们).此外,会有更多的订单,但都来自Order.

我有一个通用的view(Create.aspx)来创建一个订单,这个视图为每个继承的订单调用一个强类型的局部视图(在这种情况下OrderBottlingOrderFinishing).我Create()OrderController类上的POST请求定义了一个GET请求的方法和其他方法.第二个是如下:

public class OrderController : Controller
{
    /* rest of the …
Run Code Online (Sandbox Code Playgroud)

c# inheritance mvccontrib ninject-2 asp.net-mvc-3

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

需要一个使用nhibernate +工作单元+存储库模式+服务层+ ninject的简单示例

我在用

  • nhibernate +流利的nhibernate
  • asp.net mvc 3
  • ninject

目前我正在使用nhibernate,ninject与存储库模式和服务层.

所以我有这个

ninject

 public class NhibernateSessionFactory
    {
        public ISessionFactory GetSessionFactory()
        {
           ISessionFactory fluentConfiguration = Fluently.Configure()
                                                  .Database(MsSqlConfiguration.MsSql2008.ConnectionString(c => c.FromConnectionStringWithKey("ConnectionString")))
                                                  .Mappings(m => m.FluentMappings.AddFromAssemblyOf<Framework.Data.Mapping.TableAMap>().Conventions.Add(ForeignKey.EndsWith("Id")))
                                                  .ExposeConfiguration(cfg => cfg.SetProperty("adonet.batch_size", "20"))
                                                  .ExposeConfiguration(c => c.SetProperty("generate_statistics", "true"))
                                                  //.ExposeConfiguration(BuidSchema)
                                                  .BuildSessionFactory();

            return fluentConfiguration;
        }

        private static void BuidSchema(NHibernate.Cfg.Configuration config)
        {
            new NHibernate.Tool.hbm2ddl.SchemaExport(config).Create(false, true);
        }


 public class NhibernateSessionFactoryProvider : Provider<ISessionFactory>
    {   
        protected override ISessionFactory CreateInstance(IContext context)
        {
            var sessionFactory = new NhibernateSessionFactory();
            return sessionFactory.GetSessionFactory();
        }
    }


   public class NhibernateModule : NinjectModule
    {
        public override …
Run Code Online (Sandbox Code Playgroud)

.net nhibernate unit-of-work repository-pattern ninject-2

17
推荐指数
1
解决办法
6831
查看次数


MVC 3 Dependency Resolver或Ninject MVC插件?

在MVC 3中,他们添加了一个依赖解析器,我一直在使用它.在回答某人的问题时,有人评论过你应该使用Ninject MVC 3插件.

所以我的问题是为什么用它来构建一个?如果是这样的话你怎么设置它?

所以上面是我回答的问题的链接.

asp.net-mvc ninject ninject-2 asp.net-mvc-3

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