Asp.net mvc 从基本控制器派生控制器的正确方法

Asp.net mvc 从基本控制器派生控制器的正确方法,asp.net-mvc,Asp.net Mvc,我倾向于使用来自所有控制器的同一组存储库。也就是说,我在每个控制器中实例化存储库对象(使用IoC) 我想我可以从一个可以在一个地方实例化这些对象的基本控制器派生控制器。你能告诉我这样做的权利吗?谢谢您的帮助。您有很多选择,哪一个是“正确的方法”真正取决于您以及您的系统的整体功能。需要考虑的各种实例化对象可能存在性能问题,等等 一个选项可以简单到: public class BaseController { protected ISomeRepository myRepository =

我倾向于使用来自所有控制器的同一组存储库。也就是说,我在每个控制器中实例化存储库对象(使用IoC)


我想我可以从一个可以在一个地方实例化这些对象的基本控制器派生控制器。你能告诉我这样做的权利吗?谢谢您的帮助。

您有很多选择,哪一个是“正确的方法”真正取决于您以及您的系统的整体功能。需要考虑的各种实例化对象可能存在性能问题,等等

一个选项可以简单到:

public class BaseController
{
    protected ISomeRepository myRepository = IoCContainer.Resolve<ISomeRepository>();
}
public class MyController : BaseController { }
公共类BaseController
{
受保护的异构存储库myRepository=IoCContainer.Resolve();
}
公共类MyController:BaseController{}
此外,您可以将初始化移动到基本控制器的构造函数中,而不是像那样将其内联

另一种选择可能是延迟绑定存储库,如果让所有存储库都受到性能影响(仔细考虑实例化它们的影响),并且平均来说并不总是需要它们:

public class BaseController
{
    private ISomeRepository _myRepository;
    protected ISomeRepository myRepository
    {
        get
        {
            if (_myRepository == null)
                _myRepository = IoCContainer.Resolve<ISomeRepository>();
            return _myRepository;
        }
    }
}
公共类BaseController
{
私有异构存储库;
受保护异构存储库
{
得到
{
if(_myRepository==null)
_myRepository=IoCContainer.Resolve();
返回我的存储库;
}
}
}
你可能有更多的选择,这取决于你的设置。您的特定IoC容器的工作方式也可能在您的设计决策中发挥重要作用


(注意,为了简洁和简单,我在这里直接引用IoCContainer,但我建议将容器抽象到服务定位器后面,这样您就不会有太多对容器本身的引用。)

您有很多选择,哪一个是“正确的方法”这完全取决于您和您的系统的整体功能。需要考虑的各种实例化对象可能存在性能问题,等等

一个选项可以简单到:

public class BaseController
{
    protected ISomeRepository myRepository = IoCContainer.Resolve<ISomeRepository>();
}
public class MyController : BaseController { }
公共类BaseController
{
受保护的异构存储库myRepository=IoCContainer.Resolve();
}
公共类MyController:BaseController{}
此外,您可以将初始化移动到基本控制器的构造函数中,而不是像那样将其内联

另一种选择可能是延迟绑定存储库,如果让所有存储库都受到性能影响(仔细考虑实例化它们的影响),并且平均来说并不总是需要它们:

public class BaseController
{
    private ISomeRepository _myRepository;
    protected ISomeRepository myRepository
    {
        get
        {
            if (_myRepository == null)
                _myRepository = IoCContainer.Resolve<ISomeRepository>();
            return _myRepository;
        }
    }
}
公共类BaseController
{
私有异构存储库;
受保护异构存储库
{
得到
{
if(_myRepository==null)
_myRepository=IoCContainer.Resolve();
返回我的存储库;
}
}
}
你可能有更多的选择,这取决于你的设置。您的特定IoC容器的工作方式也可能在您的设计决策中发挥重要作用


(注意,为了简洁和简单,我在这里直接引用IoCContainer,但我建议将容器抽象到服务定位器后面,这样您就不会有太多对容器本身的引用。)

实际上,这取决于那些“公共存储库”应该完成什么样的任务。如果它们直接关系到行动应该做什么——也许这没关系。但无论如何,在国际奥委会的决议中,你会面临一些问题。为了避免每次新的Repo都注入这些存储库,您必须在基本控制器中对服务定位器进行依赖。这不是件好事

如果这些存储库与操作将要做的事情是正交的,那么它更像是AOP逻辑,所以我最好使用操作过滤器或
RenderAction


在一般情况下,我会尽量避免层超类型依赖,并且更喜欢组合而不是继承。实际上,这取决于那些“公共存储库”应该完成什么样的任务。如果它们直接关系到行动应该做什么——也许这没关系。但无论如何,在国际奥委会的决议中,你会面临一些问题。为了避免每次新的Repo都注入这些存储库,您必须在基本控制器中对服务定位器进行依赖。这不是件好事

如果这些存储库与操作将要做的事情是正交的,那么它更像是AOP逻辑,所以我最好使用操作过滤器或
RenderAction

在一般情况下,我会尽量避免层超类型依赖,并且更喜欢组合而不是继承