我有一个相当复杂的MVC 3多国网页应用程序。因此,操作和服务方法可用于多个甚至所有派生的Web应用程序,其他则是特定国家/地区。
我已经可以通过继承创建特定于国家/地区的操作:
namespace MyWebApp.Controllers.General
{
// general HomeController; can be used for all countries
public class HomeController : Controller
{
protected IService _service;
public HomeController(IService service)
{
_service = service;
}
public ActionResult Index()
{
MyViewModel viewModel = _service.DoSomethingGeneral();
return View(viewModel);
}
}
}
所以这是常用的HomeController。我现在有操作,应该用于某个特定国家/地区:
namespace MyWebApp.Controllers.CountryA
{
// country specific HomeController inherits from general HomeController
public class HomeController : MyWebApp.Controllers.General.HomeController
{
public HomeController(IService service)
: base(service)
{
}
public ActionResult CountryASpecificView()
{
MyCountryAViewModel viewModel = _service.DoSomethingCountryASpecific();
return View(viewModel);
}
}
}
因此,在我的CountryA-WebApp中,我可以同时使用操作 Index()
和CountryASpecificView
。顺便说一句,我必须通过发布命名空间来操纵global.asax
中的路由来实现这种继承
我正在使用 Unity 构造函数注入来创建服务方法。
现在的问题是如何扩展服务接口IService
,以便我的一般HomeController
无法使用方法DoSomethingCountryASpecific()
,但CountryA的HomeController
可以使用?
显然我可以将方法DoSomethingCountryASpecific()
添加到另一个界面中,但我宁愿不会出于某些原因。
我目前的做法是:
namespace MyWebApp.Services.Interfaces
{
public interface IService
{
MyViewModel DoSomethingGeneral();
MyCountryAViewModel DoSomethingCountryASpecific();
}
}
namespace MyWebApp.Services.General
{
public class MyGeneralService : IService
{
public MyViewModel DoSomethingGeneral()
{
MyViewModel viewModel = new MyViewModel();
// do something with the view model
return viewModel;
}
public MyCountryAViewModel DoSomethingCountryASpecific()
{
throw new NotImplementedException("Can be used for CountryA only.");
}
}
}
namespace MyWebApp.Services.CountryA
{
public class MyCountryAService : MyGeneralService
{
public MyCountryAViewModel DoSomethingCountryASpecific()
{
MyCountryAViewModel viewModel = new MyCountryAViewModel();
// do something with the view model
return viewModel;
}
}
}
我不喜欢它!
我不喜欢普通服务类中的throw
,我不喜欢普通服务类知道MyCountryAViewModel
。实际上MyGeneralService
不应该对某些CountryA有所了解
顺便说一句,我可以在MyCountryAService
中操纵 Unity 来使用MyGeneralService
代替global.asax
。
我希望我的问题是可以理解的,有人有一些想法 干杯西蒙