首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UnitOfWork混淆

UnitOfWork混淆
EN

Stack Overflow用户
提问于 2012-05-10 01:03:15
回答 1查看 1.1K关注 0票数 1

我一直在我的MVC3应用程序中使用Ninject,但是我正在尝试将我的数据对象的模式更改为使用UnitOfWork,并且我不知道如何让Ninject正确地处理这个问题。

我知道当在控制台应用程序中手动构造类时,我的类实现可以正常工作:

代码语言:javascript
复制
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);
}

在我的MVC3应用程序中,我使用了Ninject.MVC3 NuGet包,这是在RegisterServices方法中。

代码语言:javascript
复制
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请求(Insert、Update、Delete)都不会被执行。没有抛出任何异常,当我遍历它时,它会毫无问题地通过SaveChanges()方法,并返回堆栈,但什么也不会执行。所以我知道我的Ninject配置肯定遗漏了什么。

这是我的工作单元类。

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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。

任何关于这方面的想法都是值得感谢的。

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2012-05-10 01:16:58

我只需要这样做:

代码语言:javascript
复制
kernel.Bind<IUnitOfWork>.To<EFUnitOfWork>().InRequestScope();

EFUnitOfWork.cs

代码语言:javascript
复制
public class EFUnitOfWork : DbContext, IUnitOfWork
{
    // your normal DbContext plus your IUnitOfWork members that delegate to EF context
}

由于EF已经实现了一种形式的Unit of Work,这允许您为它使用一个更通用的接口,并轻松地注入它。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10520729

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档