0

我遇到了这种情况。我看到这里的许多开发人员都面临着类似的情况,但我仍然想指出一些细节。

我有一个典型的情况,我有一组子对象。我正在向 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);
        }

这是我得到关于会话被关闭的错误的地方。

先感谢您。

4

1 回答 1

0

您在 ISession 上设置了生活方式 Singleton。这似乎与您的错误不一致,但这不应该是 ...LifeStyle.PerWcfSession()... 还是 PerWcfOperation()?

会话功能是做什么的?(附带说明一下,一个常见的约定是将 _xxx 作为实例成员,将 xxx 作为函数参数。)

如果您在整个过程中确实拥有相同的会话,则对 Store/SaveOrUpdate 的调用是无用的,因为该对象已经被会话跟踪。

您在存储库方法上有事务。这不是问题,但要使事务有用,整个 AddContactsToUser()(或更多)应该在同一个事务中执行。

于 2012-12-27T10:44:31.377 回答