Obtenir facilité Nhibernate et mise à jour / Enregistrer événement auditeurs travail
-
02-10-2019 - |
Question
Je ne peux pas obtenir ce travail, donc je suis en espérant que quelqu'un ici peut aider:)
voici mon castle.config:
<castle>
<facilities>
<facility id="nhibernatefaciltity"
isWeb="true"
type="Castle.Facilities.NHibernateIntegration.NHibernateFacility, Castle.Facilities.NHibernateIntegration">
<factory id="sessionFactory1">
<settings>
<item key="show_sql">true</item>
<item key="connection.provider">NHibernate.Connection.DriverConnectionProvider</item>
<item key="connection.driver_class">NHibernate.Driver.SqlClientDriver</item>
<item key="connection.connection_string">Data Source=.;Initial Catalog=xxx;User Id=xxx;Password=xxx;Pooling=False</item>
<item key="dialect">NHibernate.Dialect.MsSql2005Dialect</item>
<item key="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</item>
</settings>
<assemblies>
<assembly>Namespace.Model</assembly>
</assemblies>
</factory>
</facility>
</facilities>
</castle>
Voici le conteneur mis en place dans le global.asax:
Container = new WindsorContainer(new XmlInterpreter(new ConfigResource()))
.AddFacility<WcfFacility>(f => f.Services.AspNetCompatibility =
AspNetCompatibilityRequirementsMode.Required)
.Register(
Component.For<IServiceBehavior>().Instance(metadata),
Component.For<IServiceBehavior>().Instance(debug),
Component
.For<IAppServices>()
.ImplementedBy<AppServices>()
.Named("Namespace.WebServices.AppServices")
.LifeStyle.Transient
.ActAs(new DefaultServiceModel().Hosted()
.AddEndpoints(
WcfEndpoint.BoundTo(new BasicHttpBinding()),
WcfEndpoint.BoundTo(new WSHttpBinding(SecurityMode.None)).At("ws")
))
);
var cfgs = Container.ResolveAll<NHibernate.Cfg.Configuration>();
foreach (var cfg in cfgs)
{
cfg.EventListeners.SaveEventListeners =
new ISaveOrUpdateEventListener[] { new CustomSaveEventListener() };
}
Probablement plus d'informations que nécessaire, mais je veux être complet ici.
Voici mon CustomSaveEventListener:
public class CustomSaveEventListener : DefaultSaveEventListener
{
protected override object PerformSaveOrUpdate(SaveOrUpdateEvent evt)
{
IHaveAuditInformation entity = evt.Entity as IHaveAuditInformation;
if (entity != null)
ProcessEntityBeforeInsert(entity);
return base.PerformSaveOrUpdate(evt);
}
internal virtual void ProcessEntityBeforeInsert(IHaveAuditInformation entity)
{
entity.DateAdded = DateTime.Now;
entity.DateUpdated = DateTime.Now;
}
}
Voici un exemple .hbm:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="GlastoStar.Model" namespace="GlastoStar.Model">
<class name="User" table="AppUser">
<id name="Id" column="Id" type="Int64">
<generator class="hilo"/>
</id>
<property name="FirstName"></property>
<property name="LastName"></property>
<property name="Password"></property>
<property name="UserName"></property>
<property name="Email"></property>
<property name="DateAdded"></property>
<property name="DateUpdated"></property>
<property name="Deleted"></property>
</class>
</hibernate-mapping>
Voici une entité exemple:
public class User : IHaveAuditInformation
{
public virtual Int64 Id { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
public virtual string Password { get; set; }
public virtual string UserName { get; set; }
public virtual string Email { get; set; }
public virtual DateTime DateAdded { get; set; }
public virtual DateTime DateUpdated { get; set; }
public virtual bool Deleted { get; set; }
}
AFAIK - J'ai tout fait, mais il y a des ressources Skant expliquant comment faire cela.
Il est mise sur écoute l'enfer hors de moi.
w: //
La solution 2
en utilisant la configuration couramment semblait résoudre ce problème
Autres conseils
Essayez d'utiliser l'élément de <listeners/>
à la place, par exemple:.
<castle>
<facilities>
<facility id="nhibernatefacility" ...>
<factory id="...">
<settings>
...
</settings>
<assemblies>
</assemblies>
<listeners>
<listener type="MyNamespace.CustomSaveEventListener, MyAssembly" event="Save"/>
</listeners>
...
Vous pouvez utiliser Fluent NH et l'installation du château ensemble en procédant comme suit:
config de l'installation indiquant constructeur de configuration personnalisée:
<castle>
<facilities>
<facility id="nhibernatefacility"
isWeb="true"
type="Castle.Facilities.NHibernateIntegration.NHibernateFacility, Castle.Facilities.NHibernateIntegration"
configurationBuilder="SD.Core.Data.FluentNHibernateConfigurationBuilder, SD.Core.Data">
<factory id="nhibernate.factory">
<settings>
<item key="show_sql">true</item>
<item key="connection.provider">NHibernate.Connection.DriverConnectionProvider</item>
<item key="connection.driver_class">NHibernate.Driver.OracleDataClientDriver</item>
<item key="dialect">NHibernate.Dialect.Oracle9iDialect</item>
<item key="connection.connection_string">. . . </item>
<item key="proxyfactory.factory_class">NHibernate.ByteCode.Castle.ProxyFactoryFactory, NHibernate.ByteCode.Castle</item>
</settings>
</factory>
</facility>
</facilities>
</castle>
Créez ensuite votre constructeur de configuration personnalisée, ce vous permet d'ajouter les auditeurs:
public class FluentNHibernateConfigurationBuilder : IConfigurationBuilder
{
public Configuration GetConfiguration(IConfiguration facilityConfiguration)
{
var defaultConfigurationBuilder = new DefaultConfigurationBuilder();
var configuration = defaultConfigurationBuilder.GetConfiguration(facilityConfiguration);
//configuration.Configure();
configuration.AddMappingsFromAssembly(typeof(DogMap).Assembly);
var auditUpdateEventListener = new AuditUpdateEventListener();
var auditInsertEventListener = new AuditInsertEventListener();
configuration.AppendListeners(ListenerType.PreInsert, new[] {auditInsertEventListener});
configuration.AppendListeners(ListenerType.PreUpdate, new[] {auditUpdateEventListener});
return configuration;
}
}
Enfin créer vos auditeurs:
public class AuditUpdateEventListener : IPreUpdateEventListener
{
public bool OnPreUpdate(PreUpdateEvent @event)
{
. . . .
return false;
}
}
public class AuditInsertEventListener : IPreInsertEventListener
{
public bool OnPreInsert(PreInsertEvent @event)
{
. . . .
return false;
}
}