通过多个控制器共享数据.ASP.NET MVC

本文关键字:数据 ASP NET MVC 共享 控制器 | 更新日期: 2023-09-27 18:27:39

如果我有两个控制器:

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<>));

这个能正常工作吗?我的意思是控制器会使用相同的存储库实例吗?

谢谢!

通过多个控制器共享数据.ASP.NET MVC

简单答案-是!代码将对所有控制器使用相同的实现,除非您使用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();

在singleton中使用Repository不是一个好主意。我使用InRequestScope使一个实例只服务于一个请求。如果使用实体框架,您可以查看此答案以了解详细信息

这取决于ninject中默认作用域的工作方式(我不是ninject用户)。

但是,如果在存储库映射中指定InRequestScope,它将起作用。

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

只要与数据库的连接没有关闭,Singleton作用域就会起作用。当应用程序停止工作时,它将停止工作,因为所有请求仍将尝试使用相同的存储库对象。

这就是为什么请求范围更好的原因。如果repo失败,它只会为一个请求失败(除非是数据库有问题)。

我编写了一套最佳实践:http://blog.gauffin.org/2011/09/inversion-of-control-containers-best-practices/