Ninject UnitOf Work 混乱

2023-12-08

我一直在 MVC 3 应用程序中使用 Ninject,但我正在尝试更改数据对象的模式以使用 UnitOfWork,但我无法弄清楚如何让 Ninject 正确处理此问题。

我知道当我在控制台应用程序中手动构建类时,我的类实现会起作用:

IDatabaseFactory factory = new DatabaseFactory();
IUnitOfWork worker = new UnitOfWork(factory);
IBlogCategoryDao dao = new BlogCategoryDao(factory);
IBlogCategoryService service = new BlogCategoryService(dao);

BlogCategory category = service.GetById(id);

try
{
    if (category != null)
    {
    service.Delete(category);
    worker.Commit();
    Console.WriteLine("Category deleted successfully!");
    }
    else
    {
    Console.WriteLine("Entity doesn't exist.");
    }
}
catch (Exception ex)
{
    Console.WriteLine("Error deleting category: {0}", ex.Message);
}

在我的 MVC 3 应用程序中,我使用 Ninject.MVC3 NuGet 包,它位于 RegisterServices 方法中。

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IDatabaseFactory>().To<DatabaseFactory>();
    kernel.Bind<IUnitOfWork>().To<UnitOfWork>().InRequestScope();

    kernel.Bind<IBlogCategoryDao>().To<BlogCategoryDao>();
    kernel.Bind<IBlogDao>().To<BlogDao>();

    kernel.Bind<IBlogCategoryService>().To<BlogCategoryService>();
    kernel.Bind<IBlogService>().To<BlogService>();
} 

虽然这在大多数情况下都有效,但 Get 请求、所有 POST 请求(插入、更新、删除)都不会被执行。没有抛出异常,当我单步执行它时,它毫无问题地执行 SaveChanges() 方法并返回堆栈,但没有执行任何操作。所以我知道我的 Ninject 配置中肯定缺少一些东西。

这是我的工作单元课程。

public class UnitOfWork : IUnitOfWork
{
    private Database _database;  <-- DbContext derived class

    private readonly IDatabaseFactory _databaseFactory;

    public UnitOfWork(IDatabaseFactory databaseFactory)
    {
        this._databaseFactory = databaseFactory;
    }

    public Database Database
    {
        get
        {
            return _database ?? (_database = _databaseFactory.Get());
        }
    }

    public void Commit()
    {
        Database.Commit();
    }
}

这是 DatabaseFactory 类:

public class DatabaseFactory : Disposable, IDatabaseFactory
{
    private Database _database;

    public DatabaseFactory()
    {

    }

    public virtual Database Get()
    {
        if (_database == null)
        {
            _database = DataObjectFactory.CreateContext();
        }

        return _database;
    }

    protected override void DisposeCore()
    {
        if (_database != null)
        {
            _database.Dispose();
        }
    }
}

我的 DataObjectFactory 类:

public static class DataObjectFactory
{
    private static readonly string _connectionString;

    /// <summary>
    /// Static constructor. Reads the connectionstring from web.config just once.
    /// </summary>
    static DataObjectFactory()
    {
        string connectionStringName = ConfigurationManager.AppSettings.Get("ConnectionStringName");
        _connectionString = ConfigurationManager.ConnectionStrings[connectionStringName].ConnectionString;
    }

    /// <summary>
    /// Creates the Context using the current connectionstring.
    /// </summary>
    /// <remarks>
    /// Gof pattern: Factory method. 
    /// </remarks>
    /// <returns>Action Entities context.</returns>
    public static Database CreateContext()
    {
        return new Database(_connectionString);
    }
}

这是与 EFMVC CodePlex 应用程序中使用的类似模式,但我不使用 AutoFac。

任何对此的想法都值得赞赏。

Thanks.


我只是这样做:

kernel.Bind<IUnitOfWork>.To<EFUnitOfWork>().InRequestScope();

EFUnitOfWork.cs

public class EFUnitOfWork : DbContext, IUnitOfWork
{
    // your normal DbContext plus your IUnitOfWork members that delegate to EF context
}

由于 EF 已经实现了一种工作单元形式,因此您可以使用更通用的接口,并轻松注入它。

此外,您还可以为连接字符串实现 EF 构造函数,并将它们传递给基本构造函数。然后你就可以使用 Ninject.WithConstructorArgument()使用 AppSettings 代码配置连接字符串。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Ninject UnitOf Work 混乱 的相关文章

随机推荐

  • jQuery UI 自动完成奇怪的行为

    以下是我的代码 var availableTags ActionScript AppleScript Asp BASIC C C Clojure COBOL ColdFusion Erlang Fortran Groovy Haskell
  • 一页上有多个表单

    我的个人资料编辑页面上的图像上传表单不起作用 这两种形式必须分开 因为它们独立工作 图像上传脚本在提交个人资料编辑表单之前上传图像 我在一个单独的页面上测试了图像上传 这是该页面上唯一的内容并且它有效 所以我假设是另一种形式把事情搞砸了 这
  • SQL 检查位标志

    因此应用程序具有带有位标记的复选框 根据选择的复选框选项 应用程序会将其作为整数存储在数据库中 如何查询数据库中的 int 以检查特定位是否打开 关闭 Example Decimal Binary 16 00010000 208 11010
  • 如何在iOS上使用CSS溢出来获取滚动条

    开发一个 iPad 网站我尝试使用 CSS 属性overflow auto如果需要的话获取滚动条div 但即使两根手指滚动正常 我的设备也拒绝显示它们 我尝试过 overflow auto and overflow scroll 结果是一样
  • 文件 Uri 方案和相关文件

    假设 uri 的方案是 文件 还假设路径以 开头 示例路径是 bashrc Fulluri 看起来怎么样 file bashrc 对我来说似乎很奇怪 简而言之 文件 URL 的形式如下 file localhost absolute pat
  • AWS EC2 tomcat 权限被拒绝创建/写入文件

    我有一个在弹性beanstalk EC2上运行的tomcat 64 位 Amazon Linux 2015 09 v2 0 4 运行 Tomcat 8 Java 8 当网络应用程序想要创建新的目录 文件时 我遇到了麻烦 我在 catalin
  • Javascript RegExp 可以做到部分不区分大小写吗?

    我想知道 Javascript RegExp 是否能够在正则表达式本身中打开和关闭不区分大小写 我知道您可以为整个正则表达式设置修饰符 但这不是我要讨论的内容 例如 我的搜索字符串可能是 teXT To seArcH TOP SECRET
  • 不使用 WMI 查找 USB 驱动器的序列号

    在 C 中 如何在不使用 WMI 的情况下查找 USB 驱动器的序列号 Thanks 如果您可以使用 WMI 以下链接看起来是一个不错的起点 使用 C 获取易失性 USB 序列号 您可以实现 WMI 解决方案 因为这看起来是非常简单的代码并
  • Java中带时间戳的数字签名

    我在使用可信时间戳通过 Bouncy Castle 创建有效的 CMS 签名时遇到问题 签名创建效果很好 我想将签名包含到 PDF 文件中 签名有效 但是 在我将可信时间戳添加到签名的未签名属性表中后 签名仍然有效 但读者报告说签名包含嵌入
  • R中的实时自动递增ggplot

    这个线程回答如何在 R 中创建具有实时效果的增量图 我想做同样的事情ggplot2而不是 R 的碱基plot 直接从该链接中的答案复制 我尝试了这个 但它不起作用 n 1000 df data frame time 1 n y runif
  • 工作单元中的多个通用存储库?

    假设我有 2 张桌子 ProductCategory and Product 我有 1 个可以处理两个表的通用存储库 public class GenericRepository
  • 具有不同边缘值的 Networkx Spring 布局

    我是 Networkx 的新手 试图弄清楚如何使用 spring 布局 但在节点之间应用不同的边缘值 即节点之间的不同距离 而不是相同的边缘值 本质上 我想要一个图表 尝试维持一组预定义的节点到节点距离 可能使用弹簧布局来找到一些局部最小值
  • 在vba中获取2个日期之间的所有日期

    我是 vba 的新手 我试图获取 2 个日期之间的所有日期 例如我将使用参数 01 01 2015 和 15 01 2015 调用该函数 并且我将返回一个数组包含所有可能的日期 即 01 01 2015 02 01 2015 03 01 2
  • 有没有办法确定顶部的像素?

    我需要更多的解释 但欢迎举例 我试图做到这一点 以便当我向下滚动时 屏幕上的特定元素会在滚动时淡入 唯一的问题是我需要一种方法来使用提供的代码 或更好的方法 来确定元素距离顶部有多远 有没有一种不同的方法可以使滚动效果发挥作用 而不必将其基
  • 如何使用 C# 和 ClosedXML 将新行追加到 Excel 文件?

    我应该向现有 Excel 文件追加一个新行 任务由两部分组成 添加到不存在的文件 效果很好 添加到现有文件 不起作用 它不会创建新记录 仅显示 else 正文中的旧记录 这是我的代码 private static void ExportTo
  • .htaccess URL 重写问题(脚本无法加载)

    我遇到 htaccess 中的 URL 重写问题 这是我的重写代码 RewriteEngine on RewriteBase RewriteRule terms terms php L nc RewriteRule formgate a z
  • 右键单击量角器

    我正在尝试使用量角器右键单击一个元素 该元素是农业网格中的一个单元格 我正在尝试使用我能找到的一些早期建议 唯一没有给我带来错误的建议如下 browser actions mouseMove elementVar perform brows
  • iframe 中的后退按钮(类似 iGoogle 的门户小部件)

    我正在尝试创建一个小部件 基本上是一个 iframe 它有自己的后退和前进按钮 也就是说 当我点击小部件后退按钮时 只有 iframe 返回 而不是整个小部件容器 类似 iGoogle 的门户 我添加了以下链接 a class button
  • 在扩展器中更新 Knockout js Observable 时如何保留光标位置

    目标是在用户输入时将其转换为大写 我正在使用以下扩展器 ko extenders uppercase function target option target subscribe function newValue target newV
  • Ninject UnitOf Work 混乱

    我一直在 MVC 3 应用程序中使用 Ninject 但我正在尝试更改数据对象的模式以使用 UnitOfWork 但我无法弄清楚如何让 Ninject 正确处理此问题 我知道当我在控制台应用程序中手动构建类时 我的类实现会起作用 IData