私はこの状況に陥っています。ここにいる多くの開発者が同様のシナリオに直面しているように見えますが、指摘したい詳細がまだいくつかあります。
子オブジェクトのコレクションがある典型的な状況があります。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);
}
これは、セッションが閉じられているというエラーが発生する場所です。
前もって感謝します。