4

パラメータなしのコンストラクタと連携するように、StrctureMap と FluentNHibernate を正常に構成しました。次に行う必要があるのは、パラメーターを使用してインターセプターを設定することです。

以下のコードは、私の MVC アプリケーションでうまく機能します。

protected void Application_Start()
{ 
    //Code removed from here to save space...

    ObjectFactory.Initialize(x => {
        x.For<IInterceptor>().Singleton().Use(context => new MyInterceptor());

        x.For<ISessionFactory>().Singleton().Use(context => CreateSessionFactory(context.GetInstance<IInterceptor>()));
        x.For<ISession>().HttpContextScoped().Use(context => context.GetInstance<ISessionFactory>().OpenSession());

        x.For<IAuditDao>().Use<AuditDao>().Ctor<ISessionFactory>().Is(context => context.GetInstance<ISessionFactory>());
    });
}

public static ISessionFactory CreateSessionFactory(IInterceptor interceptor)
{
    return Fluently.Configure()
        .Database(MySQLConfiguration
        .Standard
        .ConnectionString(c => c.FromConnectionStringWithKey("MySqlConnectionString")))
        .Mappings(m => { m.FluentMappings.Add<AuditItemMap>(); })
        .ExposeConfiguration(config => new SchemaUpdate(config).Execute(true, true))
        .ExposeConfiguration(config => config.SetInterceptor(interceptor))
        .BuildSessionFactory();
}

ここで行う必要があるのは、AuditDao のインスタンスをインターセプターに渡すことです。現時点では、NHibernate の「EmptyInterceptor」から継承する「MyInterceptor」には 2 つのコンストラクターがあります。

public class MyInterceptor : EmptyInterceptor
{
    private IAuditDao AuditDao;

    public MyInterceptor()
    {

    }

    public MyInterceptor(IAuditDao auditDao)
    {
        AuditDao = auditDao;
    }
}

明らかに、AuditDao のインスタンスには SessionFactory のインスタンスが必要であり、SessionFactory には AuditDao のインスタンスが必要です。

この循環参照の問題を解決するにはどうすればよいですか?

4

0 に答える 0