【问题标题】:Autofac - None of the constructors found with 'Public binding flags'Autofac - 没有找到带有“公共绑定标志”的构造函数
【发布时间】:2011-07-18 22:22:39
【问题描述】:

我在尝试解析存储库时不断收到错误消息。

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

全球.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;
    }

然后在我的通用存储库中

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

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

如果有人能指出我正确的方向,为什么这不能解决,我很困惑?

【问题讨论】:

  • ISessionFactory 在 autofac 中注册了吗?
  • 我尝试添加builder.RegisterType(typeof(ISessionFactory)).InstancePerLifetimeScope();,但仍然出现同样的错误
  • 但是你需要注册实现ISessionFactory的具体类
  • 我将其更改为builder.RegisterInstance(new NhibernateFactory()).As(typeof(INhibernateFactory)).SingleInstance();,但我仍然可以使用可用的服务和参数调用类型“Repository.Data.NHibernateSession”上的“公共绑定标志”的构造函数之一:不能解析构造函数“Void .ctor(NHibernate.ISessionFactory)”的参数“NHibernate.ISessionFactory sessionFactory”。

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


【解决方案1】:

您遇到的错误本身就说明了问题,它们说明了某种无法解决的类型。在您最近的更改之后,这是缺少的“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

【讨论】:

  • 好的,谢谢,不过我很困惑。我已经通过builder.RegisterInstance(new NhibernateFactory()).As(typeof(INhibernateFactory)).SingleInstance(); 实现了具体类型,但我仍然得到“公共绑定标志”无法找到类型“NHibernate.ISessionFactory”的构造函数。我如何解析属于其中的类型n休眠。
  • @Dr. - 你搞清楚了吗?或者有什么你认为需要详细说明的地方吗?
【解决方案2】:

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

马特

【讨论】:

  • 谢谢,我没注意到,我改了,还是一样的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多