我遇到了这种情况。我看到这里的许多开发人员都面临着类似的情况,但我仍然想指出一些细节。
我有一个典型的情况,我有一组子对象。我正在向 user.contacts 属性添加更多联系人。在我对该属性的映射lazy=true 中。我从不离开调用存储库的方法的范围。
我正在使用温莎 WCF 设施。我的理解是,根据我的配置,会话将在请求的生命周期或 WcfSession 的生命周期内存活。
如果您需要更多信息,可以问我任何问题。
这是我的 wcf 服务中的 global.asax。
container = new WindsorContainer();
container.AddFacility<AutoTxFacility>();
container.Register(Component.For<INHibernateInstaller>().ImplementedBy<NHibernateInstaller>());
container.AddFacility<NHibernateFacility>();
container.AddFacility<WcfFacility>();
container.Register(
Component.For<IRegistrationService>().ImplementedBy<RegistrationService>().LifestylePerWcfSession(),
Component.For<IAuthService>().ImplementedBy<AuthService>().LifestylePerWcfSession(),
Component.For<IUserRepository>().ImplementedBy<UserRepository>().LifestylePerWcfSession(),
Component.For<IActionWebService>().ImplementedBy<ActionWebService>().Named("ActionWebService").LifestylePerWcfSession(),
Component.For<ISession>().LifeStyle.Singleton.UsingFactoryMethod(x => container.Resolve<ISessionManager>().OpenSession()));
这是我的存储库...
public class UserRepository: IUserRepository
{
Func<ISession> session;
public UserRepository(Func<ISession> _session)
{
session = _session;
}
[Transaction]
public void Store(User user)
{
using (var tx = session())
{
tx.SaveOrUpdate(user);
}
}
[Transaction]
public User GetById(int id)
{
using (var tx=session())
{
return tx.Get<User>(id);
}
}
}
这是我对存储库的调用
public void AddContactsToUser(int userID, IList<User> contacts)
{
var user = userRepository.GetById(userID);
if (user == null)
throw new Exception("User does not exist");
user.AddReferralToUser(contacts.ToArray());
userRepository.Store(user);
}
这是我得到关于会话被关闭的错误的地方。
先感谢您。