[英]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...
方法顯式配置。
如果您想重用不是實現,而是重用對象的實例 ,則可以使用像InScope
, InRequestScope
, InSingletonScope
這樣的方法來配置它,就像您已經為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.