【发布时间】:2014-11-08 21:13:55
【问题描述】:
我正在尝试使用 Simple Injector 创建一个插件架构,该架构将允许我配置一个插件 "abc"(一个租户),如果我在查询字符串中提供了?tenant=abc我的请求将覆盖一个 "core" 插件并使用它的控制器。
例如,如果我在“核心”中有以下控制器:
public HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "This is core.";
return View();
}
}
而且,如果我指定了?tenant=abc,那么它应该加载“abc”插件控制器:
public HomeController : Controller
{
public ActionResult Index()
{
ViewBag.Message = "This is abc.";
return View();
}
}
问题是,我不太确定从哪里开始。我一直在阅读以下帖子,但似乎仍然没有将所有这些部分组合在一起的“胶水”。
- https://simpleinjector.readthedocs.org/en/latest/advanced.html#registering-plugins-dynamically
- Simple Injector with asp.net mvc 4, load controller from another assembly
- Multi-tenant IoC strategy
- Tenant Injection in multi-tenancy scenario
谁能给我一点“快速入门”,这样我就可以组建一个基本的“hello world”,支持上述功能?
编辑:我想解决方案将与此类似(Autofac 的多租户实现):
// First, create your application-level defaults using a standard
// ContainerBuilder, just as you are used to.
var builder = new ContainerBuilder();
builder.RegisterType<Consumer>().As<IDependencyConsumer>().InstancePerDependency();
builder.RegisterType<BaseDependency>().As<IDependency>().SingleInstance();
var appContainer = builder.Build();
// Once you've built the application-level default container, you
// need to create a tenant identification strategy.
var tenantIdentifier = new MyTenantIdentificationStrategy();
// Now create the multitenant container using the application
// container and the tenant identification strategy.
var mtc = new MultitenantContainer(tenantIdentifier, appContainer);
// Configure the overrides for each tenant by passing in the tenant ID
// and a lambda that takes a ContainerBuilder.
mtc.ConfigureTenant('1', b => b.RegisterType<Tenant1Dependency>().As<IDependency>().InstancePerDependency());
mtc.ConfigureTenant('2', b => b.RegisterType<Tenant2Dependency>().As<IDependency>().SingleInstance());
// Now you can use the multitenant container to resolve instances.
// Resolutions will be tenant-specific.
var dependency = mtc.Resolve<IDependency>();
- 参考。 http://www.paraesthesia.com/archive/2010/07/28/introducing-autofaccontrib.multitenant-multitenant-dependency-injection-with-autofac.aspx/
- 参考。 https://code.google.com/p/autofac/wiki/MultitenantIntegration
有没有办法用 SimpleInjector 做这种事情?
【问题讨论】:
-
如果使用查询字符串有要求吗?我认为使用 MVC 的常用方法是使用区域。这意味着您的租户仍在 url 中,但不在查询字符串中。你会得到 '/abc/home' 而不是 '/home?tenant=abc'。
-
查询字符串是必需的,因此我可以创建最基本的实现。最终,我想从请求中提供的身份验证令牌中检索租户信息。最初,我想使用区域,但我想探索将单独的 MVC 站点作为插件的选项;而不是在一个 MVC 站点中托管所有文件,这些站点分为不同的区域。
-
这个“插件控制器”是从哪里来的?同一个大会?你有一个不同的项目吗?该程序集是动态加载的,还是允许预加载(我强烈建议)?
-
你想达到什么目的?两个控制器是否使用相同的视图?他们都有自己的看法吗?这些视图位于何处?
-
按照我的设想,我将拥有三个独立的 MVC 项目。 1.“abc”插件。 2.“核心”插件。 3.插件演示。根据我的研究,看来我必须将插件程序集输出到 PluginDemo 项目。当没有指定租户时,我希望“核心”公开它的控制器和视图。指定租户后,我希望该租户覆盖所请求的任何控制器;前提是控制器存在。如果不存在控制器,那么它应该只使用“核心”控制器。
标签: c# asp.net asp.net-mvc simple-injector