Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 使用Ninject时如何处理DBContext_Asp.net Mvc_Ninject_Telerik Open Access - Fatal编程技术网

Asp.net mvc 使用Ninject时如何处理DBContext

Asp.net mvc 使用Ninject时如何处理DBContext,asp.net-mvc,ninject,telerik-open-access,Asp.net Mvc,Ninject,Telerik Open Access,我第一次尝试使用Ninject和OpenAccess。请帮我做以下事情。这是我的项目看起来像 public class ContentController : Controller { private ContentService contentSvc; public ContentController(ContentService contentSvc) { this.contentSvc = contentSvc; } } 下面的类位于我的

我第一次尝试使用Ninject和OpenAccess。请帮我做以下事情。这是我的项目看起来像

public class ContentController : Controller
{
    private ContentService contentSvc;

    public ContentController(ContentService contentSvc)
    {
        this.contentSvc = contentSvc;
    }
}
下面的类位于我的web应用程序的文件夹下

public class ContentService
{
    private IContentRepository contentRepository;

    public ContentService(IContentRepository contentRepository)
    {
        this.contentRepository = contentRepository;
    }

    public void InsertContent(Content content)
    {
         contentRepository.InsertContent(content);
    }
}
以下存储库属于一个单独的程序集

public class ContentRepository : IContentRepository
{
    DBContext db;
    public ContentRepository(DBContext _db)
    {
        db = _db;
    }

    public void InsertContent(Content content)
    {
             db.Add(content);
    }
}   
这是Ninject绑定的外观

kernel.Bind<ContentService>().To<ContentService>().InRequestScope();
kernel.Bind<IContentRepository>().To<ContentRepository>().InRequestScope().WithConstructorArgument("_db", new DBContext());
kernel.Bind().To().InRequestScope();
kernel.Bind().To().InRequestScope().WithConstructorArgument(“\db”,new DBContext());
如果我一次只取一页,一切都很好。我正在使用一个简单的工具“XENU”同时获取多个页面。这就是我通过一次获取多个页面而导致DBContext错误的原因

我不确定Ninject是否在每个请求中都添加了DBContext??我收到不同的错误,例如“对象引用未设置为对象的实例”,或“ExecuteReader需要打开且可用的连接”。连接的当前状态为“打开”

附笔。
我的MVC web应用程序的文件夹下有ContentService。ContentRepository是一个单独的程序集。我将在ContentService中添加业务逻辑,并仅对CRUD操作使用“ContentRepository”。另外,请告诉我此体系结构是否合适,或者是否有更好的方法来创建服务和存储库。

以下是我将如何进行Ninject绑定

kernel.Bind<DBContext>().ToSelf().InRequestScope();
kernel.Bind<ContentService>().ToSelf().InRequestScope();
kernel.Bind<IContentRepository>().To<ContentRepository>().InRequestScope();
kernel.Bind().ToSelf().InRequestScope();
kernel.Bind().ToSelf().InRequestScope();
kernel.Bind().To().InRequestScope();

在上面的例子中,使用EF和Ninject时,这个模式应该可以很好地工作

我非常喜欢将逻辑操作(您的服务)与数据操作(您的存储库)分开。这在过去对我来说非常有效。我认为这是一个很好的模型。谢谢,这让我省去了数周的头疼,因为我一直想弄清楚为什么我的dbcontext会不断崩溃。我还使用了WithConstructorArgument(注入)。。。这应该在某个地方更清楚地记录下来!我在使用EF时使用了kernel.Bind().To()。@Luke如果在ContentService中插入两个存储库,则会得到两个不同的上下文,当两个存储库都转到两个不同的表时,无法提交事务。这个假设正确吗?@Elisa Yeh这就是答案intention@Luke但是,如果每个存储库中有两个不同的上下文,则不能跨两个存储库执行事务。我认为这是一个问题。我建议提问者向他的服务中注入一个IUnitOfWork,这样服务就可以调用2个存储库并提交它。这将是一个更好的方法,你同意吗?@elisa的想法是,你在两个存储库之间共享DBContext,如果你有完全独立的DBContext,并且想在同一个事务中提交这两个,你需要使用事务范围和DTC,这是非常繁重的。鉴于我们讨论的是一个web应用程序,请求实际上是一个工作单元,因此在我看来,您最好在请求中涉及的所有存储库之间共享上下文。因此在上面绑定了context.InRequestScope(),那么在单元测试中呢?您的绑定看起来像什么?没有asp.net或mvc,但有类似的回购设置