簡體   English   中英

通過多個控制器共享數據。 ASP.NET MVC

[英]Sharing data thru several controllers. ASP.NET MVC

如果我有兩個控制器:

public class PrimaryController : Controller
{
    private IRepository<Primaries> repository;

    public PrimaryController(IRepository<Primaries> repository)
    {
        this.repository = repository;
    }

    // CRUD operations
}

public class AuxiliaryController : Controller
{
    private IRepository<Primaries> repository;

    public AuxiliaryController(IRepository<Primaries> repository)
    {
        this.repository = repository;
    }

    // CRUD operations
    public ActionResult CreateSomethingAuxiliary(Guid id, AuxiliaryThing auxiliary)
    {
        var a = repository.Get(id);
        a.Auxiliaries.Add(auxiliary);
        repository.Save(a);

        return RedirectToAction("Details", "Primary", new { id = id });
    }
}

DI的實現方式(代碼來自Ninject模塊)

this.Bind<ISessionFactory>()
    .ToMethod(c => new Configuration().Configure().BuildSessionFactory())
    .InSingletonScope();

this.Bind<ISession>()
    .ToMethod(ctx => ctx.Kernel.TryGet<ISessionFactory>().OpenSession())
    .InRequestScope();

this.Bind(typeof(IRepository<>)).To(typeof(Repository<>));

這會正常嗎? 我的意思是控制器使用相同的存儲庫實例?

謝謝!

簡單的答案 - 是的! 代碼將對所有控制器使用相同的實現 ,除非您使用When...方法顯式配置。

如果您想重用不是實現,而是重用對象的實例 ,則可以使用像InScopeInRequestScopeInSingletonScope這樣的方法來配置它,就像您已經為ISession和ISessionFactory做的那樣。

來自文檔:

// Summary:
//     Indicates that instances activated via the binding should be re-used within
//     the same HTTP request.
IBindingNamedWithOrOnSyntax<T> InRequestScope();


//
// Summary:
//     Indicates that only a single instance of the binding should be created, and
//     then should be re-used for all subsequent requests.
IBindingNamedWithOrOnSyntax<T> InSingletonScope();

在單例中使用Repository不是一個好主意。 我使用InRequestScope使一個實例只提供一個請求。 如果使用實體框架,您可以查看此答案以獲取詳細信息

這取決於ninject中默認作用域的工作方式(我不是ninject用戶)。

但是,如果在存儲庫映射上指定InRequestScope ,它將起作用。

this.Bind(typeof(IRepository<>))
    .To(typeof(Repository<>))
    .InRequestScope();

只要未關閉與數據庫的連接,單例范圍就會起作用。 您的應用程序將停止工作,因為所有請求仍將嘗試使用相同的存儲庫對象。

這就是Request范圍更好的原因。 如果repos失敗,它只會失敗一個請求(除非它是db的問題)。

我寫了一套最佳實踐: http//blog.gauffin.org/2011/09/inversion-of-control-containers-best-practices/

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM