这句话背后的想法是您将 Index 操作中的逻辑隔离到一个单独的依赖项中。
也就是说,现在你可能有一个类似这样的控制器:
public class MyController : Controller
{
protected IDataService _dataService;
public MyController(IDataService dataService)
{
this._dataService = dataService;
}
public virtual ActionResult Index()
{
var data = this._dataService.GetData();
var model = new IndexModel()
{
Data = data
};
return this.View(model);
}
public virtual ActionResult OtherAction()
{
// other stuff...
}
}
在那个 Index 操作中,您正在获取数据,并且可能在将数据传递给视图之前对数据执行一些业务逻辑。
使用这样的设计,您的租户特定需要获取一些额外的数据意味着您必须覆盖控制器。这实际上并不太难,如果您决定为其他服务依赖项进行属性注入,它应该可以工作。
public class TenantSpecificController : MyController
{
// If you set up PropertiesAutowired on the tenant controller
// registration, you'll get this property populated.
public IOtherService OtherService { get; set; }
public TenantSpecificController(IDataService dataService)
: base(dataService)
{
}
public override ActionResult Index()
{
var data = this._dataService.GetData();
var otherData = this.OtherService.GetData();
var model = new IndexModel()
{
Data = data
};
// You can't really change the model without changing the
// view, so extended data goes in the ViewData or ViewBag
this.ViewData["other"] = otherData;
return this.View(model);
}
}
但是文档中的那句话暗示的是,如果您知道您将在该控制器中拥有一些花哨的租户覆盖逻辑(不仅仅是一次性的,因为控制器覆盖在一次性场景中很容易) 然后将逻辑拉出控制器,如下所示:
public class MyController : Controller
{
protected IIndexModelGeneratorService _modelService;
public MyController(IIndexModelGeneratorService modelService)
{
this._modelService = modelService;
}
public virtual ActionResult Index()
{
var model = this._modelService.BuildModel();
return this.View(model);
}
public virtual ActionResult OtherAction()
{
// other stuff...
}
}
然后,您不是在控制器/操作级别进行租户覆盖,而是在特定服务上进行租户覆盖。您正在将业务逻辑从控制器中拉出到其他依赖项中。
显然,这可能意味着改变模型以允许更多可扩展的数据......
public class IndexModel
{
public DataObject Data { get; set; }
public Dictionary<string, object> ExtendedData { get; set; }
}
...或者也许您的数据服务实现需要一个字典来填充:
public interface IIndexModelGenerator
{
IndexModel BuildModel(ViewDataDictionary dict);
}
...所以当你调用它时,你的控制器会传入 ViewData 字典来捕获额外的数据:
var model = this._modelService.BuildModel(this.ViewData);
这个想法仍然成立——如果你有很多这样的东西,将业务逻辑分解成多租户组件可能比每个租户拥有不同的控制器更容易。