Autofac - Ни один из конструкторов не найден с 'Открытыми флагами привязки' - PullRequest
2 голосов
/ 17 июля 2011

Я продолжаю получать сообщение об ошибке при попытке разрешить свои репозитории.

Ни один из конструкторов, найденных с «Открытыми флагами привязки» для типа, не может быть вызван с доступными службами и параметрами: Не удается разрешить параметр «Repository.Data.INHibernateSession nHibernateSession» конструктора «Void .ctor (Repository.Data.INHibernateSession)».

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

тогда в моем Универсальном хранилище

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 ]

3 голосов
/ 17 июля 2011

Ошибки, которые вы получаете, говорят сами за себя, они указывают некоторый тип, который не может быть решен. После вашего последнего изменения это интерфейс ISessionFactory, который отсутствует.

Для дальнейшего уточнения: текущая проблема заключается в том, что Autofac, когда его просят построить NHibernateSession экземпляров, не знает, как предоставить ISessionFactory экземпляр. Чтобы «научить» контейнер создавать фабрики сессий, недостаточно предоставить только экземпляр NHibernateFactory. Рассмотрим эту регистрацию:

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

Последняя строка регистрирует лямбду, которая знает, как предоставить экземпляр фабрики сеансов.

Вам нужно будет предоставить контейнер для каждого задействованного типа. Используйте ошибку «no constructors ...», чтобы увидеть, какие типы отсутствуют.

Чтобы углубиться в Autofac и NHibernate, вам придется искать по сети. Например. В этом вопросе обсуждаются сессии NHibernate: Управление NHibernate ISession с помощью Autofac

0 голосов
/ 17 июля 2011

Я не знаком с AutoFac;но должен ли ваш класс NHibernateSession реализовывать интерфейс INHibernateSession для правильного разрешения?

Мэтт

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...