我遇到了這個問題,同時尋找一個解決方案,使用簡單注射器與流利nhibernate(從Ninject切換到簡單注射器時)。這個例子不使用工作單元模式,因爲真的nHibernate的會話是工作單位容器。這是它是如何做(ASP.NET MVC exmple)
SessionProvider
public class SessionProvider
{
private readonly string _connectionString;
private ISessionFactory _sessionFactory;
public ISessionFactory SessionFactory
{
get { return _sessionFactory ?? (_sessionFactory = CreateSessionFactory()); }
}
public SessionProvider(string connectionString)
{
_connectionString = connectionString;
}
private ISessionFactory CreateSessionFactory()
{
return Fluently.Configure()
.Database(SQLiteConfiguration.Standard.ConnectionString(_connectionString)
.Driver<ProfiledSQLiteClientDriver>)
.Mappings(m => m.FluentMappings.AddFromAssembly(Assembly.GetExecutingAssembly()))
.ExposeConfiguration(cfg => cfg.Properties.Add("use_proxy_validator", "false"))
.BuildSessionFactory();
}
}
的Global.asax.cs
var sessionProvider = new SessionProvider(ConfigurationManager.ConnectionStrings["sqlite"].ConnectionString);
var container = new SimpleInjector.Container();
container.Options.DefaultScopedLifestyle = new WebRequestLifestyle();
container.Register(typeof(IRepository<>), new[] { typeof(Repository<>).Assembly });
container.RegisterSingleton<ICommandDispatcher>(new CommandDispatcher(container));
container.Register(typeof(ICommandHandler<>), new[] { typeof(UserCommandsHandler).Assembly });
/* here comes Session wiring ....*/
container.Register(() => sessionProvider.SessionFactory, Lifestyle.Singleton);
container.Register<ISession>(()=> container.GetInstance<ISessionFactory>().OpenSession(), Lifestyle.Scoped);
container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));
您可能要修改你的問題,並添加額外的細節(如作爲堆棧跟蹤信息和使用情況),因爲您的問題目前過於寬泛,並且不清楚確切問題是什麼。 – Steven
我解決... 我改進了我的架構,豐富了我的領域,減少了「控制器」的職責,讓服務保持協商和解決問題。因爲我使用AutoMapper來操作導致此錯誤的DTO par Model對象。 –