将我的UnitOfWork注入我的Repository Constructor

时间:2011-02-24 22:13:55

标签: nhibernate repository structuremap

我非常新,但是我正在尝试用结构图学习nhibernate和DI,所以我正在制作一个应用来测试一切。

我在将我的unitofwork注入我的基础存储库时遇到了一些问题。我在每个请求上创建一个unitofwork,然后在最后提交或回滚。但是当我尝试注入我的基础存储库时,当我在我的方法中使用它时,它总是为null。更具体地说,我得到这个错误:“对象引用未设置为对象的实例”。任何想法我做错了,如果这是我应该去的正确路线?

非常感谢提前。

Base Repository:

public abstract class Repository<T> : IRepository<T>
{
  public readonly IUnitOfWork _unitOfWork;

  public Repository(IUnitOfWork UnitOfWork)
  {
    UnitOfWork = _unitOfWork;
  }

  public Repository() {}

  public void Save(T obj)
  {
    _unitOfWork.CurrentSession.Save(obj);
  }
}

我的application_start中设置的StructureMap注册表:

 public class NHibernateRegistry : Registry
 {
   public NHibernateRegistry()
   {
     For<IUnitOfWork>().HybridHttpOrThreadLocalScoped().Use<UnitOfWork>();

     For<ISession>().HybridHttpOrThreadLocalScoped().Use(context => context.GetInstance<ISessionFactory>().OpenSession());

     For<ISessionFactory>().Singleton().Use(NHibernateSessionFactory.GetSessionFactory());
   }
 }

更新

baserepository由特定的存储库继承,即ArticleRepository然后将其注入到application_start上的aspx页面中。然后我的aspx页面继承了buildUp发生的基页。我像这样访问存储库:

public IArticleRepository ArticleRepo { get; set; }

public void SaveThing()
{
    ArticleRepo.Save(object);
}

这会在application_start上调用:

  public class Bootstrapper
  {
    public static void BootStrap()
    {
      ObjectFactory.Configure(x =>
      {
        x.AddRegistry<NHibernateRegistry>();
        x.AddRegistry<WebRegistry>();
      });
    }
  }

在网络注册中:

For<IArticleRepository>().Use<ArticleRepository>();

2 个答案:

答案 0 :(得分:3)

您的ArticleRepository很可能没有以IUnitOfWork为参数的构造函数,以确保您拥有以下内容

public class ArticleRepository : Repository<Article>
{
    public ArticleRepository(IUnitOfWork unitOfWork) : base(unitOfWork)
    {
    }
...
}

记住Strcuture map使用它实例化的类上最贪婪的构造函数。由于您的抽象存储库类永远不会被实例化,因此它不会使用其构造函数。如果您的类需要以这种方式注入其依赖项,我还建议不要使用任何默认构造函数。错误发生的可能性更小。

答案 1 :(得分:1)

  public readonly IUnitOfWork _unitOfWork;

  public Repository(IUnitOfWork UnitOfWork)
  {
    UnitOfWork = _unitOfWork;
  }

我认为你的意思是写

  public readonly IUnitOfWork _unitOfWork;

  public Repository(IUnitOfWork UnitOfWork)
  {
    _unitOfWork = UnitOfWork;
  }

您将局部变量分配给参数而不是局部变量的参数。

编辑:你也应该用小写的U'unitOfWork'而不是'UnitOfWork'来编写你的参数