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 с подсветкой синтаксиса является обязательным!)
Больше информации об идентификаторах скобок в блоге Эрика Липперта :
Итак, я прошу прощения за то, что мы не получили ранее выполненный пример 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();
}
}
}
Помогает ли это: http://devlicio.us/blogs/billy_mccafferty/archive/2007/02/05/inject-di-container-into-domain-objects-with -nhibernate.aspx
Я действительно не получил ответов, которые искал, но я нашел хороший фреймворк под названием N Общий . Он реализует шаблон единицы работы вместе с шаблоном репозитория с NHibernate, LinqToSql или Entity Framework. Он также обрабатывал NHibernate ISession, а также настраивал NHibernate. Я использовал инструмент с StructureMap и NHibernate. Мне нужно было получить сервисный адаптер для StructureMap, но после настройки он работает довольно хорошо.