2011-11-28 25 views
1

我使用NHibernate 3.0.0.1001和Castle.Facilities.NHibernateIntegration 1.1.0.0城堡NHibernate的集成 - 創建一個通用的configurationBuilder

我使用城堡注入的ISessionManager到我的會話管理類。

我指定我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類

但有那麼任何方式指定web.config工具中的「T」是什麼?

例如,我知道我不能做到這一點:

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

的可能重複[配置城堡Windosor和通用(HTTP:// stackoverflow.com/questions/2272104/configure-castle-windosor-and-generic) – stuartd

+0

嗨,斯圖爾特,它行嗎?!謝謝,但我認爲這有很大的不同。我試圖避免必須在配置生成器中指定模型。 – Sean

回答

1

得到它的工作!這是如何做到這一點:

配置中的建設者

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"> 
相關問題