2011-03-08 79 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很多,真棒:)!

相關問題