NHibernate и карта структуры

Идентификаторы скобок в VBScript

VBScript имеет так называемые идентификаторы скобок , которые являются идентификаторами, определенными в квадратных скобках, например:

[Foo]

Они ' на самом деле это очень удобно, так как они позволяют вам именовать переменные и подпрограммы после зарезервированных слов, вызывать методы сторонних объектов, чьи имена являются зарезервированными словами, а также использовать практически любые символы Юникода (включая пробелы и специальные символы) в идентификаторах. Но это также означает, что вы можете повеселиться с ними:

[2*2] = 5

[Здравствуй, мир!] = [Hello, world!]

[] = "Looks like my name is an empty string, isn't that cool?"

For[For[i=0]=[0]To[To[To[0]
  [Next[To]([For[i=0])=[For[i=0]
Next

С другой стороны, идентификаторы скобок могут быть ошибкой, если вы забудете кавычки в утверждении, подобном этому:

If MyString = "[Something]" Then

, потому что If MyString = [Something] Then - совершенно законный синтаксис. (И именно поэтому IDE с подсветкой синтаксиса является обязательным!)


Больше информации об идентификаторах скобок в блоге Эрика Липперта :

11
задан dionysus55 13 July 2009 в 22:02
поделиться

3 ответа

Итак, я прошу прощения за то, что мы не получили ранее выполненный пример NHibernate с StructureMap. В конце концов, я хотел бы опубликовать его в документации StructureMap, но сначала мне нужны отзывы. Вы можете увидеть полный пример в моем блоге:

http://trason.net/journal/2009/10/7/bootstrapping-nhibernate-with-structuremap.html

При этом я могу выделить основные моменты Вот. Существует NHibernateRegistry, который делает доступными четыре вещи: NHibernate.Configuration (как синглтон), ISessionFactory (как синглтон), ISession (гибрид с ограниченным объемом (HttpContext, если он доступен, откат к локальному хранилищу потоков)) и очень простой IUnitOfWork. Также существует HttpModule для управления UnitOfWork для каждого веб-запроса.

Вот код для NHibernateRegistry:

using NHibernate;
using NHibernate.ByteCode.Castle;
using NHibernate.Cfg;
using NHibernate.Dialect;
using NHibernate.Driver;
using NHibernateBootstrap.Core.Domain;
using StructureMap.Attributes;
using StructureMap.Configuration.DSL;
using Environment=NHibernate.Cfg.Environment;

namespace NHibernateBootstrap.Core.Persistence
{
    public class NHibernateRegistry : Registry
    {
        public NHibernateRegistry()
        {
            var cfg = new Configuration()
                .SetProperty(Environment.ReleaseConnections, "on_close")
                .SetProperty(Environment.Dialect, typeof(SQLiteDialect).AssemblyQualifiedName)
                .SetProperty(Environment.ConnectionDriver, typeof(SQLite20Driver).AssemblyQualifiedName)
                .SetProperty(Environment.ConnectionString, "data source=bootstrap.sqlite;Version=3")
                .SetProperty(Environment.ProxyFactoryFactoryClass, typeof(ProxyFactoryFactory).AssemblyQualifiedName)
                .AddAssembly(typeof(Blog).Assembly);

            var sessionFactory = cfg.BuildSessionFactory();

            ForRequestedType<Configuration>().AsSingletons().TheDefault.IsThis(cfg);

            ForRequestedType<ISessionFactory>().AsSingletons()
                .TheDefault.IsThis(sessionFactory);

            ForRequestedType<ISession>().CacheBy(InstanceScope.Hybrid)
                .TheDefault.Is.ConstructedBy(ctx => ctx.GetInstance<ISessionFactory>().OpenSession());

            ForRequestedType<IUnitOfWork>().CacheBy(InstanceScope.Hybrid)
                .TheDefaultIsConcreteType<UnitOfWork>();

                ForRequestedType<IDatabaseBuilder>().TheDefaultIsConcreteType<DatabaseBuilder>();
        }
    }
}

Вот код для Unit of Work:

using System;
using NHibernate;

namespace NHibernateBootstrap.Core.Persistence
{
    public interface IUnitOfWork : IDisposable
    {
        ISession CurrentSession { get; }
        void Commit();  
    }
}

using NHibernate;

namespace NHibernateBootstrap.Core.Persistence
{
    public class UnitOfWork : IUnitOfWork
    {
        private readonly ISessionFactory _sessionFactory;
        private readonly ITransaction _transaction;

        public UnitOfWork(ISessionFactory sessionFactory)
        {
            _sessionFactory = sessionFactory;
            CurrentSession = _sessionFactory.OpenSession();
            _transaction = CurrentSession.BeginTransaction();
        }

        public ISession CurrentSession { get; private set;}

        public void Dispose()
        {
            CurrentSession.Close();
            CurrentSession = null;
        }

        public void Commit()
        {
            _transaction.Commit();
        }
    }
}

Вот NHibernateModule для веб-приложений:

using System;
using System.Web;
using NHibernateBootstrap.Core.Persistence;
using StructureMap;

namespace NHibernateBootstrap.Web
{
    public class NHibernateModule : IHttpModule
    {
        private IUnitOfWork _unitOfWork;

        public void Init(HttpApplication context)
        {
            context.BeginRequest += ContextBeginRequest;
            context.EndRequest += ContextEndRequest;
        }

        private void ContextBeginRequest(object sender, EventArgs e)
        {
            _unitOfWork = ObjectFactory.GetInstance<IUnitOfWork>();

        }

        private void ContextEndRequest(object sender, EventArgs e)
        {
            Dispose();
        }

        public void Dispose()
        {
            _unitOfWork.Dispose();
        }
    }
}
23
ответ дан 3 December 2019 в 04:53
поделиться
  • Отредактируйте здесь: я разместил этот комментарий до того, как был опубликован ответ wbinford. Я по-прежнему считаю, что использование NCommon - это хорошо, но его ответ выше немного чище и не требует использования другого стороннего инструмента.

Я действительно не получил ответов, которые искал, но я нашел хороший фреймворк под названием N Общий . Он реализует шаблон единицы работы вместе с шаблоном репозитория с NHibernate, LinqToSql или Entity Framework. Он также обрабатывал NHibernate ISession, а также настраивал NHibernate. Я использовал инструмент с StructureMap и NHibernate. Мне нужно было получить сервисный адаптер для StructureMap, но после настройки он работает довольно хорошо.

0
ответ дан 3 December 2019 в 04:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: