2011-03-08 89 views
3

我有很多并不总是静态值(口号,横幅,描述...)和部分视图(block_head,block_footer,block_right),我应该在那里显示它。所以,我需要在每次操作中将这些值的大集合传递给Partial,这对我来说不是很好。在构造函数中使用参数实现控制器

我在这里找到有趣的解决方案:http://www.asp.net/mvc/tutorials/passing-data-to-view-master-pages-cs,部分是“良好的解决方案”。我可以在ApplicationController中移动这些值的所有初始化,并从我的控制器实现它。

但是,我想继续在ApplicationController中初始化我的接口:)如果我能做到这一点,我认为它应该是太棒了。我使用Ninject,所以,一些代码:

public abstract class ApplicationController : Controller 
{ 
    // 
    // GET: /Application/ 
    private readonly IModuleRepository _moduleRepository; 
    public IModuleRepository moduleRepository 
    { 
     get { return _moduleRepository; } 
    } 

    public ApplicationController(IModuleRepository moduleRepository) 
    { 
     _moduleRepository = moduleRepository; 

     foreach (var module in _moduleRepository.GetAllModules()) 
      ViewData[module.name] = module.value; 
    } 
} 

实现:

public class HomeController : ApplicationController 
{ 
    //I can use here moduleRepository without HomeController initialization 
} 

只是一个问题,我不知道如何实现ApplicationController中,如果有争论。这是不错的方式,它是我的问题的任何解决方案?将来我要设置5-7个接口,并且有大约10-15个控制器,所以在ApplicationController和Implement中可以很好地初始化它们。 Thx,抱歉,如果问题很愚蠢。


好了,并说:

现在,如果我有10个接口,它应该是这样的:

public class HomeController 
{ 
    private IModuleRepository _moduleRepository; 
    private IBookRepository _bookRepository; 
    private ITableRepository _tableRepository; 
    private IClassRepository _classRepository; 
    private IRoomRepository _roomRepository; 
    private IUserRepository _userRepository; 
    private IWindowRepository _windowRepository; 
    private IChairRepository _chairRepository; 
    private IDoorRepository _doorRepository; 
    private IWCRepository _wcRepository; 

    public HomeController(IModuleRepository moduleRepository, IBookRepository bookRepository, ITableRepository tableRepository, IClassRepository classRepository, IRoomRepository roomRepository, IUserRepository userRepository, IWindowRepository windowRepository, IChairRepository chairRepository, IDoorRepository doorRepository, IWCRepository wcRepository) 
    { 
     _moduleRepository = moduleRepository; 
     _bookRepository = bookRepository; 
     _tableRepository = tableRepository; 
     _classRepository = classRepository; 
     _roomRepository = roomRepository; 
     _userRepository = userRepository; 
     _windowRepository = windowRepository; 
     _chairRepository = chairRepository; 
     _doorRepository = doorRepository; 
     _wcRepository = wcRepository; 
    } 

    public ActionResult Index() 
    { 
     ViewBag.Windows = _windowRepository.GetAllWindows(); 
     ViewBag.Doors = _doorRepository.GetAllDoors(); 
     // e.t.c. 

     return View(); 
    } 
} 

,我已经在我的每个控制器的初始化这个地方我需要使用这个版本库(Home,Admin,...)。

所以,如果我能做出这样的事情:

public class HomeController : ApplicationController 
{ 
    public ActionResult Index() 
    { 
     ViewBag.Windows = windowRepository.GetAllWindows(); 
     ViewBag.Doors = doorRepository.GetAllDoors(); 

     return View(); 
    } 
} 

和初始化这里只是一个时间:

public abstract class ApplicationController : Controller 
{ 
    public ApplicationController(IModuleRepository moduleRepository, IBookRepository bookRepository, ITableRepository tableRepository, IClassRepository classRepository, IRoomRepository roomRepository, IUserRepository userRepository, IWindowRepository windowRepository, IChairRepository chairRepository, IDoorRepository doorRepository, IWCRepository wcRepository) 
    { 
     // Initialize repositories just one time here 
    } 
} 

它可能是很好的,但我需要通过在构造函数的参数的实施类

回答

1
更好

你总是可以使用Ninject依赖解析器来获得实例,这样反而of_:

public ApplicationController(IModuleRepository moduleRepository, IBookRepository bookRepository, ITableRepository tableRepository, IClassRepository classRepository, IRoomRepository roomRepository, IUserRepository userRepository, IWindowRepository windowRepository, IChairRepository chairRepository, IDoorRepository doorRepository, IWCRepository wcRepository) 
    { 
     // Initialize repositories just one time here 
    } 

你可以做

protected readonly IModuleRepository ModuleRepository; 
// same for the rest...  

public ApplicationController() 
{ 
    this.ModuleRepository = MvcApplication.Container.Get<IModuleRepository>(); 
    // same for rest or your modules. 
} 

如果你在MVC3这将是:

protected readonly IModuleRepository ModuleRepository; 

public ApplicationController() 
{ 
    this.ModuleRepository = DependencyResolver.Current.GetService<IModuleRepository>(); 
    // same for rest or your modules. 
} 
3

看起来你可能会谈论Constructor Injection。您的子类的构造函数可以调用你的基地型的构造,以注入IModuleRepository

public class HomeController : ApplicationController 
{ 

    public HomeController(IModuleRepository moduleRepository) : base(moduleRepository) 
    { 
     //other constructor code here 
    } 

    public HomeController() : this(null) 
    { 
     //default constructor 
    } 

} 


public abstract class ApplicationController : Controller 
{ 

    public IModuleRepoistory _moduleRepository { get; private set; } 

    public ApplicationController(IModuleRepository moduleRepository) 
    { 
    _moduleRepository = moduleRepository ?? new DefaultModuleRepository(); 

    //... 
    } 
} 

如果将来你打算注入大量的接口,那么你很可能会关闭using Setter Injection

+0

不,这不是我想要做的。 – FSou1 2011-03-08 11:40:36

+1

我很抱歉误解你的问题,你可能需要澄清一下你的问题,以获得更好的答案。 – 2011-03-08 11:44:19

+0

已更新第一条消息 – FSou1 2011-03-08 12:17:05

1

叶氏,这是真的比第一个答案更好,因为现在我有:

public abstract class ApplicationController : Controller 
{ 
    protected readonly IModuleRepository _moduleRepository; 
    public IModuleRepository moduleRepository 
    { 
     get { return _moduleRepository; } 
    } 

    public ApplicationController() 
    { 
     this._moduleRepository = DependencyResolver.Current.GetService<IModuleRepository>(); 

     foreach (var module in _moduleRepository.GetAllModules()) 
      ViewData[module.name] = module.value; 

    } 
} 

而且我不需要做任何在我的控制器的变化。只实现并且可以与仓库工作:

public class HomeController : ApplicationController 
{ 
    public ActionResult Index() 
    { 
     ViewBag.Modules = moduleRepository.GetAllModules(); 
     return View(); 
    } 
} 

而且在我所有的控制器中,我有ViewData的值,传递PartialViews的全额征收。 Thx很多,真棒:)!

相关问题