1

IoC - Unity に問題があります。

簡単なウェブアプリを作りました。これは、PostId、title、Text の 3 つのフィールドを持つ 1 つのテーブル「Post」で構成されます。私は汎用リポジトリを使用します:

    public abstract class BaseRepository<T> : IBaseRepository<T> where T : class
    {
        protected ObjectContext db = new BlogDbEntities();

        /* CRUD */
    }

    public class PostRepository : BaseRepository<Post>, IPostRepository
    {
        public void Search(Expression<Func<Post, object>> predicate) 
        {
          /* some search specific entity logic */   
        }
    }

    public interface IPostRepository : IBaseRepository<Post>
    {
        void Search(Expression<Func<Post, object>> predicate);
    }

ご覧のとおり、そのリポジトリを int して、新しい BlogDbEntities - ObjectContext を作成します。コントローラーでは IPostRepository を使用します。コントローラーは非常にシンプルです。

public class PostController : Controller
    {

        IPostRepository postRepository;

        public PostController(IPostRepository postRepository) 
        {
            this.postRepository = postRepository;
        }


        public ActionResult Index()
        {
            postRepository.All.ToList();
            return View();
        }


        protected override void Dispose(bool disposing)
        {
            postRepository.Dispose();
            base.Dispose(disposing);
        }

    }

そして Global.asax では、Unity との依存関係を解決します。

 var container = new UnityContainer();
            var controllerFactory = new UnityControllerFactory(container);
            ControllerBuilder.Current.SetControllerFactory(controllerFactory);
            container.RegisterType<IPostRepository, PostRepository>(new ContainerControlledLifetimeManager());

たとえば /Post/ などのリクエストを行うときにアプリケーションを起動した後、最初のリクエストは正常に実行されました。しかし、リクエストを再度実行しようとすると、「ObjectContext インスタンスが破棄されたため、接続が必要な操作には使用できなくなりました」という例外が発生します。

Unity IoC フレームワークなしでリクエストを実行しようとすると、例外が表示されず、ObjectContext が正常に動作します。

その動作の原因は Unity だと思います。Unity Container に格納されたコンテキストだと思います。各リクエストの後にコンテキストを再作成して Unity を適切に構成する方法を教えてください。

4

1 に答える 1

2

各リクエストの後にコンテキストを再作成してUnityを適切に構成する方法を教えてくれる人。

タイプを登録するときに、 TransientLifetimeManagerを使用するように指定できます。これにより、各呼び出しで新しいインスタンスが作成されます。

于 2012-09-18T20:58:52.417 に答える