andrebaltieri / Flunt

Validations and Notifications
https://github.com/andrebaltieri/flunt
MIT License
624 stars 162 forks source link

Flunt x Nhibernate #38

Closed diogokrejci closed 3 years ago

diogokrejci commented 4 years ago

Boa tarde André! Estou usando o Flunt e me deparei com uma questão.

Ao utilizar o Nhibernate, ele exige que os métódos Invalid, Valid e Notifications sejam virtual. Existe alguma maneira de eu contornar essa situação?

Obrigado

walter-psjr commented 4 years ago

@diogokrejci tive o mesmo problema aqui, a única forma de contornar que encontrei foi desabilitar a validação de proxy do NHibernate na configuração da sessionFactory:

configuration.SetProperty(NHibernate.Cfg.Environment.UseProxyValidator, false.ToString());

Acabei removendo o Flunt e adotando outra estratégia, mas essa configuração funcionou (não sei se pode ter algum problema desabilitando isso).

filipimosquini commented 3 years ago

Bom,

Para conseguir usar o Flunt com o NHibernate fiz as seguintes configurações usando as bibliotecas:

  <ItemGroup>
    <PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="3.1.8" />
    <PackageReference Include="NHibernate" Version="5.3.3" />
    <PackageReference Include="MySql.Data" Version="8.0.21" />
    <PackageReference Include="FluentNHibernate" Version="3.0.1" />
    <PackageReference Include="NHibernate.Driver.MySqlConnector" Version="2.0.0" />
  </ItemGroup>

Criei uma classe de extensão do serviço de configuração para uso no Startup.cs

image

image

image

No método AddNHibernate adicionei a configuração mencionada pelo @walter-psjr usando o Fluently

Fluently.Configure()
                                         .Database(MySQLConfiguration.Standard
                                         .ConnectionString(connectionString))                                         
                                         .Mappings(m => 
                                         {
                                             m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly());
                                         })
                                         .ExposeConfiguration(c => 
                                         {
                                             **c.SetProperty(NHibernate.Cfg.Environment.UseProxyValidator, Boolean.FalseString);**
                                         })
                                         .BuildSessionFactory();

Nos mapeamentos relacionais eu ignorei os Atributos do Flunt pois no meu contexto não se aplicam à persistência. Para isso adicionei a interface IAutoMappingOverride<T> e no método Override fiz as configurações abaixo:

        public void Override(AutoMapping<MeasurementUnity> mapping)
        {
            mapping.IgnoreProperty(x => x.Notifications);
            mapping.IgnoreProperty(x => x.Valid);
            mapping.IgnoreProperty(x => x.Invalid);
        }

Com isso consegui usar o Flunt com o NHibernate.

image

Espero ter ajudado.