Замок NHibernate Integration - Создание общей конфигурации Builder - PullRequest
1 голос
/ 28 ноября 2011

Я использую Nhibernate 3.0.0.1001 и Castle.Facilities.NHibernateIntegration 1.1.0.0

Я использую Castle для добавления ISessionManager в мои классы управления сеансами.

Я указываю My ConfigurationBuilder в файле web.config следующим образом:

   <castle>
   <facilities>
   <facility id="MyNhibernateFacility"
    type="Castle.Facilities.NHibernateIntegration.NHibernateFacility, Castle.Facilities.NHibernateIntegration"
    isWeb="false"
    configurationBuilder="MyDomainModelAssembly.ConfigurationBuilder, MyDomainModelAssembly">
      <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.SqlClientDriver</item>
          <item key="dialect">NHibernate.Dialect.MsSql2005Dialect</item>
          <item key="connection.connection_string">Data Source=.\SQL2005;Initial
           Catalog=MyDb;User Id=xxx;Password=xxx;MultipleActiveResultSets=true</item>
          <item key="proxyfactory.factory_class">
          NHibernate.ByteCode.Castle.ProxyFactoryFactory,  
          NHibernate.ByteCode.Castle</item>
         </settings>
      </factory>
    </facility>

Мой класс "ConfigurationBuilder" выглядит так:

 public class ConfigurationBuilder : IConfigurationBuilder
   {
       public Configuration GetConfiguration(IConfiguration facilityConfiguration)
       {
           var defaultConfigurationBuilder = new DefaultConfigurationBuilder();
           var configuration =  
           defaultConfigurationBuilder.GetConfiguration(facilityConfiguration);

          return Fluently.Configure(configuration)
            .Mappings(ConfigureMappings)
            .BuildConfiguration();
      }

    public void ConfigureMappings(MappingConfiguration mappingConfiguration)
    {
        mappingConfiguration.FluentMappings
            .AddFromAssemblyOf<MyModelClass>()
            .Conventions.Add(
                ForeignKey.EndsWith("Id"),
                PrimaryKey.Name.Is(n => "Id"),
                DefaultCascade.None(),
                new HiLoPrimarykeyConvention());
    }

    public class HiLoPrimarykeyConvention : IIdConvention
    {
        public void Apply(IIdentityInstance instance)
        {
            instance.GeneratedBy.HiLo("1000");
        }
    }
   }

Я хотел бы сделать ConfigurationBuilder более общим, чтобы он не зависел от моделей, с которыми он сопоставляется.

Так что вместо:

 .AddFromAssemblyOf<MyModelClass>().

Я хотел бы сказать что-то вроде:

.AddFromAssemblyOf<T>().

Я могу сделать это в классе ConfigurationBuilder

но есть ли способ указать, что означает "T" в средстве web.config?

Например, я знаю, что не могу сделать это:

  <castle>
   <facilities>
   <facility ...
  configurationBuilder="MyGenericNhibernateSessionManagementAssembly.
  ConfigurationBuilder<MyModelClass>, MyGenericNhibernateSessionManagementAssembly">

1 Ответ

1 голос
/ 29 ноября 2011

Работай! вот как это сделать:

в вашем конструкторе конфигурации:

  public class ConfigurationBuilder<T> :
  ...
  public static void ConfigureMappings(MappingConfiguration mappingConfiguration)
   {
        mappingConfiguration.FluentMappings
            .AddFromAssemblyOf<T>()

Тогда в вашем web.config

<castle>
<facilities>
<facility ...
   configurationBuilder="MyGenericNhibernateSessionManagementAssembly.
   ConfigurationBuilder`1[[YourModelsAssembly.AModel, YourModelsAssembly]],  
   MyGenericNhibernateSessionManagementAssembly">
...