gpt4 book ai didi

NHibernate:如何注入(inject)对实体的依赖

转载 作者:行者123 更新时间:2023-12-04 00:30:12 25 4
gpt4 key购买 nike

NHibernate 3.2/Fluent NHibernate 1.3/StructureMap 2.6.3 -

尝试遵循 DDD 作为架构策略,我通常不依赖域实体。但是,我现在正在尝试向我的域实体添加更多行为,这样它们就不会那么虚弱。一切都很顺利,直到我连接了 NHibernate。我有两个问题:

  • NH 需要一个无参数的构造函数,我宁愿没有
    不应该使用的ctor。
  • 当 NH 尝试实例化我的实体时,它需要解析我的
    依赖项,但我没有给 NH 任何它可以做的事情
    那。

  • 我一直在网上阅读,但我发现的大多数(如果不是全部)示例都已过时(或只是旧的)。尽管 NH 阵营可能不赞成我正在做的事情,但我正在寻找 NH 的方法来做到这一点。

    最佳答案

    该解决方案最终实现了 NHibernate 的 IInterceptor。当您从 EmptyInterceptor 继承并重写 Instantiate() 和 SetSession() 方法时,它实际上是一个非常简单的实现。这是我使用 StructureMap 的拦截器:

    public class DependencyInjectionEntityInterceptor : EmptyInterceptor
    {
    IContainer _container;
    ISession _session;

    public DependencyInjectionEntityInterceptor(IContainer container)
    {
    _container = container;
    }

    public override void SetSession(ISession session)
    {
    _session = session;
    }

    public override object Instantiate(string clazz, EntityMode entityMode, object id)
    {
    if (entityMode == EntityMode.Poco)
    {
    var type = Assembly.GetAssembly(typeof (SomeClass)).GetTypes().FirstOrDefault(x => x.FullName == clazz);
    var hasParameters = type.GetConstructors().Any(x => x.GetParameters().Any());
    if (type != null && hasParameters)
    {
    var instance = _container.GetInstance(type);

    var md = _session.SessionFactory.GetClassMetadata(clazz);
    md.SetIdentifier(instance, id, entityMode);
    return instance;
    }
    }
    return base.Instantiate(clazz, entityMode, id);
    }
    }

    然后,你所要做的就是告诉 NHibernate 使用你的拦截器:
    public FluentConfiguration GetFluentConfiguration(IContainer container)
    {
    return Fluently.Configure()
    .Database(MsSqlConfiguration.MsSql2008
    .ConnectionString(c => c.FromConnectionStringWithKey("Database"))
    .ShowSql())
    .Mappings(m =>
    m.AutoMappings.Add(AutoMap.AssemblyOf<SomeClass>()))
    .ExposeConfiguration(x =>
    x.SetInterceptor(new DependencyInjectionEntityInterceptor(container)));
    }

    当我研究这个时,有人建议将 SessionFactory 传递给拦截器类的 ctor。老实说,从 session 管理的角度来看,这种方法会更好。

    关于NHibernate:如何注入(inject)对实体的依赖,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8023352/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com