ikn*_*edo 4 .net asp.net-mvc dependency-injection simple-injector asp.net-mvc-4
我正在使用Simple Injector作为Ioc工具开发一个asp.net mvc 4网站。这将是一个可插入的体系结构。一些控制器和视图在另一个程序集中(另一个mvc4应用程序Plugin.Web.dll)。从主应用程序中,我知道Plugin.Web.dll的路径,正在加载插件。
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
container.Options.AllowOverridingRegistrations = true;
var appPath = AppDomain.CurrentDomain.BaseDirectory;
string[] files = Directory.GetFiles(appPath + "\\Plugins", "*",
SearchOption.AllDirectories);
foreach (var fileName in files)
{
Console.WriteLine(fileName);
var assembly = Assembly.LoadFrom(fileName);
container.RegisterMvcControllers(assembly);
var controllerTypes =
from type in assembly.GetExportedTypes()
where type.Name.EndsWith("Controller",
StringComparison.Ordinal)
where typeof(IController).IsAssignableFrom(type)
where !type.IsAbstract
select type;
// Instead of verify:
foreach (var type in controllerTypes)
{
container.GetInstance(type);
}
}
container.Options.AllowOverridingRegistrations = false;
container.Verify();
DependencyResolver.SetResolver(
new SimpleInjectorDependencyResolver(container));
Run Code Online (Sandbox Code Playgroud)
它没有错误。
但是,当我单击此单击时,在视图中:
@Html.ActionLink("plugin page","PluginPage","Plugin")
Run Code Online (Sandbox Code Playgroud)
它显示“找不到资源。http404”
提前致谢
恐怕您还需要做更多的研究,因为您的问题目前有点模糊,但是这里有一些提示:
检查是否System.Web.Compilation.BuildManager.GetReferencedAssemblies()返回您的插件程序集。MVC 在从该方法返回的所有程序集中DefaultControllerFactory搜索Controller类型。最好是将您的插件文件夹放在/ bin目录中。如果我没记错的话,GetReferencedAssemblies()还会查看/ bin的子目录。如果必须更动态地加载插件,则可能需要编写自定义控制器工厂。
还请参阅本文,因为它描述了如何强制BuildManager知道您的插件程序集。
您的配置似乎过于复杂。以下配置也可以解决问题:
container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();
var appPath = AppDomain.CurrentDomain.BaseDirectory;
string[] files = Directory.GetFiles(appPath + "\\bin\\Plugins", "*",
SearchOption.AllDirectories);
container.RegisterMvcControllers(
from fileName in files
select Assembly.LoadFrom(fileName)
);
container.Verify();
Run Code Online (Sandbox Code Playgroud)
您可以查询容器的配置以查看其包含的内容。例如,这将查询所有注册的控制器:
var registeredControllerTypes = (
from registration in container.GetCurrentRegistrations()
where typeof(IController).IsAssignableFrom(registration.ServiceType)
select registration.ServiceType)
.ToArray();
Run Code Online (Sandbox Code Playgroud)