使用Unity扩展ASP.Net MVC 3中的接口

时间:2012-07-23 08:52:11

标签: c# asp.net-mvc-3 inheritance dependency-injection unity-container

我有一个相当复杂的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

我希望我的问题是可以理解的,有人有一些想法 干杯西蒙

0 个答案:

没有答案