0

私はこの状況に陥っています。ここにいる多くの開発者が同様のシナリオに直面しているように見えますが、指摘したい詳細がまだいくつかあります。

子オブジェクトのコレクションがある典型的な状況があります。user.contacts プロパティに連絡先を追加しています。私のマッピングでは、そのプロパティで lazy=true です。リポジトリを呼び出すメソッドのスコープを離れることはありません。

Windsor WCF Facility を使用しています。私の構成に基づいて、セッションはリクエストの存続期間中、または 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でライフスタイルシングルトンを設定します。これはエラーと矛盾しているように思われますが、これは... LifeStyle.PerWcfSession()...またはPerWcfOperation()ではありませんか?

セッション関数は何をしますか?(補足として、一般的な規則は、インスタンスメンバーとして_xxxを使用し、関数パラメーターとしてxxxを使用することです。)

全体を通して本当に同じセッションがある場合、オブジェクトはすでにセッションによって追跡されているため、Store/SaveOrUpdateの呼び出しは役に立ちません。

リポジトリメソッドにトランザクションがあります。これは問題ではありませんが、トランザクションを有効にするには、AddContactsToUser()全体(またはそれ以上)を同じトランザクション内で実行する必要があります。

于 2012-12-27T10:44:31.377 に答える