2011-02-24 22 views
0

虽然我非常新,但为了学习nhibernate和DI与结构图,所以我正在制作一个应用程序来测试所有东西。将我的UnitOfWork注入到我的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); 
    } 
} 

StructureMap注册表多数民众赞成在我的Application_Start设置:

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由特定repositorys继承,即ArticleRepository然后即时注入到这一点我application_start上的aspx页面。然后,我的aspx页面继承buildUp发生的basepage。我访问存储库这样的:

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>(); 
     }); 
    } 
    } 

,并在webregistry:

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

你如何实例化你的仓库? – mxmissile 2011-02-24 22:48:09

+0

@geepie多数民众赞成你如何注册它,你如何“获得”的.aspx页面IArticleRepository的一个实例? – mxmissile 2011-02-24 23:28:03

+0

我会假设他只是在做var repository = ObjectFactory.GetInstance (); – Phill 2011-02-24 23:50:00

回答

3

有一个很好的机会你ArticleRepository没有一个构造函数的IUnitOfWork作为一个参数确定您有以下几点

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

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

1
public readonly IUnitOfWork _unitOfWork; 

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

我想你的意思写

public readonly IUnitOfWork _unitOfWork; 

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

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

编辑:你也应该写一个小写U“的UnitOfWork”,而不是你的参数“的UnitOfWork”

+0

嗨Phill,把他们转了一圈,我仍然有同样的问题。 – gdp 2011-02-25 00:04:58

+0

您是否在构造函数中放置了一个断点以查看UoW是否被传入? – Phill 2011-02-25 00:08:52

+0

嗨Phill,是的,我试过了,断点没有捕获任何东西,调试器直接进入保存方法中的_unitOfWork。 – gdp 2011-02-25 00:41:18

相关问题