如何在没有参数的情况下调用注入的构造函数?

时间:2015-12-08 04:46:51

标签: c# dependency-injection unity-container constructor-injection

我有以下构造函数,其中ISession配置为解析为NHibernate会话:

public EntityStore(ISession session)
{
    Session = session;
}

UnityConfig如下:

container.RegisterType<ISessionFactory>(new ContainerControlledLifetimeManager(), new InjectionFactory(sf => new NhibernateSessionFactory().GetSessionFactory()));

现在,由于某种原因,我希望Unity在调用构造函数时注入一个会话,如下所示:

Claims = new EntityStore<TClaim, TKey>();

有人可以帮助这个绝对的Unity新手如何实现我上面描述的内容吗?

1 个答案:

答案 0 :(得分:1)

如果您希望使用Unity创建对象,则需要调用Resolve方法之一。在你的情况下,你可以做这样的事情:

Claims = container.Resolve<EntityStore<TClaim, TKey>>();

var s = container.Resolve<ISessionFactory>();
var Claims = new EntityStore<TClaim, TKey>(s);

这种方法有两个缺点。首先,您需要在班级中访问container,这并不总是可行的。其次,您在类中创建依赖项,这使得它可以跟踪所有依赖项。

更好的方法是将所有依赖项作为构造函数参数或属性注入,并仅在顶级元素(例如Application类或主窗体)中使用container.Resolve。在这种情况下,您可以替换您的类,以便将EntityStore<TClaim, TKey>作为构造函数参数注入:

public class YourClass
{
    public YourClass(EntityStore<TClaim, TKey> store)
    {
        // save reference to store and use it later
    }
}