将参数传递给castle.windsor的envers

时间:2017-09-12 17:28:14

标签: c# nhibernate fluent-nhibernate castle-windsor nhibernate-envers

我试图扩展Envers RevInfo类并为审计添加一些属性。我有一个Web API项目,xx.infrastructure.dependency,xx.datalayer.nhibernate库等等。我也使用owin进行身份验证。

我'在xx.infrastructure.dependency库中注册和安装所有容器,并在我的Web API项目上调用Installer静态方法。

public static WebApiControllerActivator Installer()
    {
        createContainer();
        return new WebApiControllerActivator(_container);
    }

    private static void createContainer()
    {
        _container = new WindsorContainer();

        _container.Kernel.ComponentRegistered += Kernel_ComponentRegistered;

        Dictionary<string, object> parameters = new Dictionary<string, object>();
        parameters.Add("userId", "10421");

        _container.Install(new ServiceInstaller());
        _container.Install(new RepositoryInstaller());
        _container.Install(new NHibernateInstaller(parameters));
        _container.Install(new ControllerInstaller());
        _container.Install(new LoggerInstaller());
        _container.Register(Component.For<UnitOfWorkInterceptor>().LifeStyle.PerWebRequest.LifestylePerWebRequest());
    }

Nhibernate安装程序注册sessionfactory ...

container.Register(
            Component.For<ISessionFactory>().UsingFactoryMethod((k, m, c) => NHibernateSessionFactory.CreateSessionFactory(_factoryParameters)).LifeStyle.Singleton,
                Component.For<ISession>().UsingFactory<ISessionFactory, ISession>(factory => factory.OpenSession()).LifestylePerThread()
            );

以及下面的CreateSessionFactory方法..

var enversConf = new EnversNHibernate.Configuration.Fluent.FluentConfiguration();

        List<Type> domainEntities = AppDomain.CurrentDomain.GetAssemblies().
            Where(assembly => assembly.FullName.StartsWith("XXXX")).
            FirstOrDefault().GetTypes()
            .Where(t => (typeof(Entity<int>).IsAssignableFrom(t) || typeof(Entity<Guid>).IsAssignableFrom(t) || typeof(Entity<ulong>).IsAssignableFrom(t) ||
                typeof(Entity<long>).IsAssignableFrom(t)) && !t.IsGenericType)
            .ToList();

        foreach (Type type in domainEntities)
            enversConf.Audit(type);

        CoreNHibernate.Cfg.Configuration cfg = new CoreNHibernate.Cfg.Configuration();
        cfg = config.BuildConfiguration();

        cfg.BuildMappings();
        cfg.SetInterceptor(new TrackingInterceptor(factoryParameters));

        //Envers RevType Values
        //0(ADD), 1(MOD) and 2(DEL)
        ConfigurationKey.AuditTableSuffix.SetUserValue(cfg, "_LOG");
        enversConf.SetRevisionEntity<CustomRevInfo>(e => e.Id, e => e.RevisionDate, new CustomRevInfoListener(factoryParameters));
        cfg.IntegrateWithEnvers(enversConf);

        config.ExposeConfiguration(exp => new SchemaUpdate(cfg).Execute(false, true));
        return config.BuildSessionFactory();

下面的CustomRevInfo监听器......

public class CustomRevInfoListener : IRevisionListener
{
    private ulong _userId = ulong.MinValue;

    public CustomRevInfoListener(Dictionary<string, object> additionalParameters) : base()
    {
        _userId = ulong.Parse(additionalParameters["userId"].ToString());
    }

    public void NewRevision(object revisionEntity)
    {
        ((CustomRevInfo)revisionEntity).UserId = _userId;
    }
}

现在我尝试将参数传递给CustomRevInfoListener以添加一些其他自定义审核属性,但我无法通过构造函数参数添加运行时间是一种方法来执行此操作还是我的逻辑错误?

0 个答案:

没有答案