создание репозиториев NHibernate в моделях представления с IoC - PullRequest
1 голос
/ 01 ноября 2011

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

Например, я использую платформу Caliburn Micro с усилителем Castle Windsor.

Сначала я создалРепозиторий NHibernate:

public interface IRepository{//I omitted not needed code for simplification}

public class NHibRepository: IRepository
{
   private ISession _session;

   public NHibRepository(ISession session)
   {
     _session=session;
   }
   // I omitted not needed code for simplification
}

Во-вторых, я определил некоторый класс POCO и класс отображения с Fluent NHibernate.

public class User{}
public class Profile{}
public class Album{}

public class UserMap : ClassMap<User>{}
public class ProfileMap : ClassMap<Profile>{}
public class AlbumMap : ClassMap<Album>{}

Теперь мне нужно использовать репозитории NHibernate в моих моделях представления.

public interface IViewModelA{}

public class ViewModelA : ScreenViewModel, IViewModelA
{
 public NHibRepository<User> UserRepo{get;set;}
 public NHibRepository<Profile> ProfileRepo{get;set;}

}

public interface IViewModelB{}

public class ViewModelB : Screen, IViewModelB
{
 public NHibRepository<Profile> ProfileRepo{get;set;}
 public NHibRepoistory<Album> AlbumRepo{get;set;}
}

Когда я создаю класс репозитория для некоторого класса сущностей, мне нужно передать сессию в NHibRepository construtor.

UserRepo= new NHibRepository<User>(NHIBERNATE SESSION);

До сих пор я использовал некоторый вспомогательный класс для создания сеанса Nhibernate и репозитория init.

Вспомогательный класс здесь:

public class FluentNHibHelper
{
    private ISessionFactory _sessionFactory;

    public FluentNHibHelper(IPersistenceConfigurer db, Assembly asm)
    {
        InitializeSessionFactory(db, asm);
    }


    private void InitializeSessionFactory(IPersistenceConfigurer db, Assembly asm)
    {
        _sessionFactory = Fluently.Configure()
            .Database(db)
            .Mappings(m => m.FluentMappings.AddFromAssembly(asm))
            .ExposeConfiguration(cfg => new SchemaUpdate(cfg).Execute(true, true))
            .BuildSessionFactory();
    }

    public ISession OpenSession()
    {
        return _sessionFactory.OpenSession();
    }
}

с этим классом я создал класс репозитория:

private const string ConnString =
    @"Server=TestMachine\SQLEXPRESS;Database=TEST;Trusted_Connection=True;";

UserRepo = new NHibRepository<User>(
        new FluentNHibHelper(MsSqlConfiguration.MsSql2008.ConnectionString(ConnString),
            Assembly.GetExecutingAssembly())
        .OpenSession());

Теперь я запутался, у меня нет лучшего способа создания объекта репозиторияв моделях зрения.

Например, в классе начальной загрузки я могу как-то зарегистрировать класс репозитория?

public class CastleBootstrapper : Bootstrapper<IShellViewModel>
{
    private IWindsorContainer _windsorContainer;

    protected override void Configure()
    {
        _windsorContainer = new WindsorContainer();
        //register repository class here ???

    }
}

Кто-нибудь может мне помочь?Большое спасибо

Извините за мой английский.

1 Ответ

0 голосов
/ 16 ноября 2011

Я использую следующее в приложении ASP.net MVC. Castle.Windsor позаботится о создании зависимости ISession для каждого репозитория.

//Located in your application startup
protected IWindsorContainer CreateContainer()
{
  container = new WindsorContainer();

  container.Install(
    new PersistenceInstaller(),
    new RepositoryInstaller()
    //, other installers here
  );

  return container;
}


public class PersistenceInstaller : IWindsorInstaller
  {
      public void Install(IWindsorContainer container, IConfigurationStore store)
      {
          container.AddFacility<PersistenceFacility>();
      }
  }

public class PersistenceFacility : AbstractFacility
{
      protected override void Init()
      {
          NHibernate.Cfg.Configuration config = BuildDatabaseConfiguration();

          Kernel.Register(
              Component.For<ISessionFactory>()
                  .UsingFactoryMethod(config.BuildSessionFactory),
              Component.For<ISession>()
                  .UsingFactoryMethod(k => k.Resolve<ISessionFactory>().OpenSession())
                  .LifeStyle.Trasient
          );
      }

      private NHibernate.Cfg.Configuration BuildDatabaseConfiguration()
      {
          return Fluently.Configure()
              .Database(SetupDatabase)
              .Mappings(m => m.HbmMappings.AddFromAssemblyOf<Entity>())
              .ExposeConfiguration(ConfigurePersistence)
              .BuildConfiguration();
      }

      protected virtual IPersistenceConfigurer SetupDatabase()
      {
          return MsSqlConfiguration.MsSql2008
              .UseOuterJoin()
              .ConnectionString(x => x.FromConnectionStringWithKey("ApplicationServices"))
              .ShowSql();
      }

      protected virtual void ConfigurePersistence(NHibernate.Cfg.Configuration config)
      {
          SchemaMetadataUpdater.QuoteTableAndColumns(config);
      }

      protected virtual bool IsDomainEntity(Type t)
      {
          return typeof(DomainBase).IsAssignableFrom(t);
      }
}



public class RepositoryInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Find().Configure(ConfigureLifeStyle()));
    }

    private ConfigureDelegate ConfigureLifeStyle()
    {
        return c => c.LifeStyle.Transient;
    }
    private BasedOnDescriptor Find()
    {
        return AllTypes.FromAssemblyContaining<NHRepository>()
                            .Where(type => type.Name.EndsWith("Repository"))
                            .WithService
                                .AllInterfaces();
    }
}
...