Как заставить WCF-StructureMap-NHibernate работать вместе? - PullRequest
0 голосов
/ 25 февраля 2011

Может кто-нибудь указать мне современный пример того, как интегрировать все 3 из этих инструментов? Я нашел несколько примеров, но они кажутся устаревшими. Вот примеры, которые я нашел.

http://www.lostechies.com/blogs/jimmy_bogard/archive/2008/09/16/integrating-structuremap-and-nhibernate-with-wcf.aspx
http://andreasohlund.net/2009/04/27/unitofwork-in-wcf-using-structuremap/ <- не обращается к nhibernate <br> http://blog.coreycoogan.com/2010/05/26/structuremap-wcf-nhibernate-part-1/
http://blog.coreycoogan.com/2010/05/27/structuremap-wcf-nhibernate-part-2/

Я начал пробовать пример coreycoogan, но столкнулся с несколькими проблемами. Он показывает создание реестра StructureMap, в который вводится зависимость в конструктор реестра, но он не показывает, как это сделать эта часть. Я никогда не видел этот пример с StructureMap Реестры. Все примеры, которые я видел, имеют параметры без параметров contstructor.

Возможно ли это, если да, то как? Я звоню в Метод ObjectFactory.Initialize в классе Bootstrapper, который делает вызов к сканеру с соглашениями по умолчанию и вызов Метод LookForRegistries. Это находит все классы реестра, кроме для той, которая нуждается в введенной зависимости. Я бы предположил, так как я неправильно подключен, или это невозможно.

Вот небольшая часть этого примера кода для реестра, который находится в часть 2 его поста:

/// <summary>  
/// A StructureMap registry for telling the container how to resolve an ISession request.  
/// This must be instantiated and added to the SM configuration so it has an instance of the  
/// SessionFactory to use.  
/// </summary>  
public class WcfNHibernateRegistry : Registry  
{  
    public WcfNHibernateRegistry(ISessionFactory sessionFactory)  
    {
        For<NHibernate.ISession>()  
            .Use(() => sessionFactory.GetCurrentSession());  
    }  
}  

1 Ответ

0 голосов
/ 25 февраля 2011

Что касается инициализации StructureMap ...

Метод LookForRegistries находит только классы реестра, которые имеют конструкторы с нулевым параметром. Это имеет смысл - StructureMap еще не инициализирован и не готов к использованию; он не готов вводить зависимости. Если вы хотите внедрить зависимость в ваш класс Registry, вам нужно сделать это вручную. (Если есть другие методы, я не знаю о них.)

Если вы следуете «примеру 1» отсюда http://structuremap.net/structuremap/RegistryDSL.htm#section2, вы можете сделать это, но я полагаю, что в примере предполагается, что вы будете использовать полученный экземпляр Container, а не обязательно статические методы ObjectFactory. (Не уверен, как работает регистрация типов в определенном контейнере.)

Кроме того, вы можете удалить параметр конструктора. Я верю, что это будет работать:

public class WcfNHibernateRegistry : Registry
{
    public WcfNHibernateRegistry()
    {
        For<ISessionFactory>().Singleton().Use(() => {
            var cfg = new NHibernate.Cfg.Configuration();
            cfg.Configure();
            return cfg.BuildSessionFactory();
        });

        For<ISession>().Use(() => {
            var fac = ObjectFactory.GetInstance<ISessionFactory>();
            return fac.GetCurrentSession();
        });
    }
}
...