Autofac - 没有找到“公共绑定标志”的构造函数

时间:2011-07-17 15:23:46

标签: nhibernate asp.net-mvc-3 dependency-injection autofac

我在尝试解决我的存储库时遇到错误。

可以使用可用的服务和参数调用在类型上找到“公共绑定标志”的构造函数: 无法解析构造函数'Void .ctor(Repository.Data.INHibernateSession)'的参数'Repository.Data.INHibernateSession nHibernateSession'。

Global.asax中

builder.RegisterAssemblyTypes(assembly).Where(t => typeof(IDependency).IsAssignableFrom(t)).
            AsImplementedInterfaces().InstancePerLifetimeScope();
        builder.RegisterAssemblyTypes(assembly).Where(t => typeof(ISingletonDependency).IsAssignableFrom(t)).
            AsImplementedInterfaces().SingleInstance();
        builder.RegisterAssemblyTypes(assembly).Where(t => typeof(ITransientDependency).IsAssignableFrom(t)).
            AsImplementedInterfaces().InstancePerDependency();

        builder.RegisterGeneric(typeof(Repository<>)).As(typeof(IRepository<>)).InstancePerDependency();

然后我有我的单身工厂

public interface INhibernateFactory : ISingletonDependency
{
    ISessionFactory SessionFactory { get; }
}

然后是我的每生命实例

public interface INHibernateSession : IDependency
{
    ISession Session { get; }
}

public class NHibernateSession : IDependency
{
    private ISession _session;
    private readonly ISessionFactory _sessionFactory;

    public NHibernateSession(ISessionFactory sessionFactory)
    {
        _sessionFactory = sessionFactory;
    }

然后在我的Generic存储库中

public class Repository<T> : IRepository<T> where T : class
{
    private readonly INHibernateSession _nHibernateSession;

    public Repository(INHibernateSession nHibernateSession)
    {
        _nHibernateSession = nHibernateSession;
    }


    public ISession Session
    {
        get { return _nHibernateSession.Session; }
    }

似乎我正在做的就是创建一个单例,将其注入会话,然后注入存储库。 (我所有其他依赖项工作正常)

感谢有人能指出我正确的方向,为什么这不会解决,我很难过?

2 个答案:

答案 0 :(得分:3)

你得到的错误自己说话,他们陈述了一些无法解决的类型。在您最近的更改之后,这是缺少的“ISessionFactory”界面。

进一步阐述:当前的问题是Autofac在被要求构建NHibernateSession个实例时,不知道如何提供ISessionFactory实例。要“学习”容器如何构建会话工厂,仅提供NHibernateFactory实例是不够的。考虑这个注册:

builder.RegisterType<NhibernateFactory>().As<INhibernateFactory>().SingleInstance();
builder.Register(c => c.Resolve<INhibernateFactory>().SessionFactory);

最后一行注册了一个知道如何提供会话工厂实例的lambda。

您需要为容器提供所涉及的每种类型。使用“no constructors ...”错误来查看缺少哪些类型。

要进一步深入了解Autofac和NHibernate,你必须在网上搜索。例如。这个问题讨论了NHibernate会话: Managing NHibernate ISession with Autofac

答案 1 :(得分:0)

我不熟悉AutoFac;但你的NHibernateSession类是否必须实现你的INHibernateSession接口才能正确解析?

马特