如果我有两个控制器:
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<>));
这会正常吗?我的意思是控制器会使用相同的存储库实例吗?
谢谢!
答案 0 :(得分:2)
简单回答 - 是的!除非您使用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
使一个实例只提供一个请求。如果使用实体框架,您可以查看this answer了解详情
答案 1 :(得分:1)
这取决于ninject中的默认范围如何工作(我不是ninject用户)。
如果您在存储库映射上指定InRequestScope
,它将起作用。
this.Bind(typeof(IRepository<>))
.To(typeof(Repository<>))
.InRequestScope();
只要未关闭与数据库的连接,单例范围就会起作用。您的应用程序将停止工作,因为所有请求仍将尝试使用相同的存储库对象。
这就是为什么请求范围更好。如果repos失败,它只会失败一个请求(除非它是db的问题)。
我写了一套最佳做法:http://blog.gauffin.org/2011/09/inversion-of-control-containers-best-practices/