- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
加载 Web 应用程序后,CaSTLe Windsor 找不到 Controller 。路径“”的 Controller 未找到或未实现 IController。当我查看内核(在 CustomControllerFactory 中)时,我发现所有 Controller 都已正确注册。
主 MVC 应用程序加载 3 个其他 DLL。当我们在 Visual Studio 中直接引用 DLL 并加载它正在运行的插件类型时。但是当动态加载它时,它说失败。当我请求 URL 时,传入 GetControllerInstance 的上下文是正确的,但 Type 参数为空。
我正在使用 Assembload.LoadFrom 加载程序集。然后我检索 Types foreach 模块,它是插件的子类。这导致我有 3 种类型。
Assembly assembly = Assembly.LoadFrom(module);
Type pluginType = assembly.GetTypes()
.Single(x => x.IsSubclassOf(typeof(Plugin)));
然后我创建了一个插件实例,我用它来注册路由。
(IPlugin)Activator.CreateInstance(type))
注册路由:
public static void RegisterRoutes(RouteCollection routes, IEnumerable<IPlugin> plugins)
{
routes.IgnoreRoute("{resource}.axd/{*pathInfo}");
var pluginRouteDefaults = new {action = "Index", id = UrlParameter.Optional};
foreach (var plugin in plugins)
{
var context = new AreaRegistrationContext(plugin.Area, routes);
context.MapRoute(plugin.Area, $"{plugin.Area}/{{controller}}/{{action}}/{{id}}", pluginRouteDefaults, plugin.GetControllerNamespaces().ToArray());
}
routes.MapRoute(
name: "Default",
url: "{area}/{controller}/{action}/{id}",
defaults: new { area = "Framework", controller = "Home", action = "Index", id = UrlParameter.Optional },
namespaces: new string[] { "Web.Framework.Controllers" }
);
}
自定义 Controller 工厂:
public class CustomControllerFactory : DefaultControllerFactory
{
private readonly IKernel _kernel;
public VlcControllerFactory(IKernel kernel)
{
this._kernel = kernel;
}
public override void ReleaseController(IController controller)
{
_kernel.ReleaseComponent(controller);
}
protected override IController GetControllerInstance(RequestContext context, Type controllerType)
{
if (controllerType == null)
{
return base.GetControllerInstance(context, controllerType);
}
try
{
return (IController)_kernel.Resolve(controllerType);
}
catch
{
return base.GetControllerInstance(context, controllerType);
}
}
}
注册 Controller 。完成此操作后,我可以在 Visual Studio 的“模块”窗口中看到 DLL 已加载。 AppDomain.CurrentDomain.GetAssemblies() 也表示已加载 DLL。
container.Register(
Classes.FromThisAssembly().BasedOn<IController>().LifestyleTransient());
我在其中找到 Dll 的 MvcApplication 类。
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
var directories = Directory.GetDirectories("C:\Projects\main\modules").Where(x => !x.EndsWith("Framework"));
string subPath = GetSubPath();
List<Type> pluginTypes = GetPluginTypes(directories, subPath);
var plugins = GetIPlugins(pluginTypes);
Launcher.CreateWindsorContainer(plugins.ToArray());
}
private static List<IPlugin> GetIPlugins(List<Type> pluginTypes)
{
List<IPlugin> plugins = new List<IPlugin>{new MvcInstaller()};
pluginTypes.ForEach(type => plugins.Add((IPlugin) Activator.CreateInstance(type)));
return plugins;
}
private static List<Type> GetPluginTypes(IEnumerable<string> directories, string subPath)
{
List<Type> pluginTypes = new List<Type>();
foreach (string directory in directories)
{
string module = Directory.GetFiles(directory + subPath).SingleOrDefault(x => x.EndsWith("Plugin.dll"));
if (!string.IsNullOrEmpty(module))
{
Assembly assembly = Assembly.LoadFrom(module);
Type pluginType = assembly.GetTypes()
.Single(x => x.IsSubclassOf(typeof(Plugin)));
pluginTypes.Add(pluginType);
}
}
return pluginTypes;
}
private static string GetSubPath()
{
#if DEBUG
var subPath = @"\bin\Debug\";
#else
subPath = @"\bin\Release\";
#endif
return subPath;
}
}
当我省略此代码并直接引用其他 Dll 并执行以下操作时:
Launcher.CreateWindsorContainer(new PluginA(), new PluginB(), new MVCPlugin());
然后它运行完美,但是随着我加载 Dll, Controller 的解析失败了。为什么 CaSTLe Windsor 在请求 Controller 时找不到 Type?
最佳答案
这里的问题不是您的 Controller 的 Windsor 分辨率。 DefaultControllerType.GetControllerType()
方法可能返回 null
,因为您没有将程序集添加到 BuildManager
(使用 BuildManager .AddReferencedAssembly(程序集)
)。请记住,您只能在应用程序启动之前调用它,因此您需要使用 [assembly:PreApplicationStartupMethod(typeof(...SomeType), "PublicStaticVoidMethodOnSomeType")
。
关于c# - 使用带有动态加载 DLL 的 CaSTLe Windsor 解析 Controller ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35272788/
我在调用 Resolve 时遇到异常: KernelException: Could not instantiate custom activator Inner Exception: {"Const
我的应用程序使用“SignalR”客户端/服务器通信框架。如果您不熟悉它,服务器端应用程序通常包含一个或多个“集线器”类(类似于 asmx 网络服务),每个类都提供可由客户端调用的方法。在启动期间,客
假设我有这样的组件 public class MyComponent { public MyComponent(string name) { } } 我基本上想让提供的构造函数
在 CaSTLe Windsor 场景中,我想检查我的容器是否注册了某个服务,并且基本上做 if (container.HasComponentFor()) { // resolve serv
我想知道是否有一些最佳实践来实现我需要的功能。 我有一个 Web 应用程序,它在启动期间通过反射扫描某些程序集(插件)并针对公共(public)内核注册它们的依赖项。 外部库可能需要相同的依赖项。 例
我想知道是否有一些最佳实践来实现我需要的功能。 我有一个 Web 应用程序,它在启动期间通过反射扫描某些程序集(插件)并针对公共(public)内核注册它们的依赖项。 外部库可能需要相同的依赖项。 例
是否有关于如何使用 CaSTLe Windsor 的自动事务管理的任何简单示例? documentation似乎缺少一些信息。我看到有用于 nHibernate、ActiveRecord 等的工具……
考虑这个例子: public class Factory { private List subFactories; public Factory(Lis
我正在将我们的项目从 .Net 2 升级到 .Net4.5,同时我将尽可能多的引用推送到 NuGet 并确保版本是最新的。 我在运行其中一项测试时遇到问题 测试类: public cl
当我开始使用 Windsor 时,我认为 DI 会很简单。现在它让我越来越困惑。 在我看来,存储库是一个具有单例生命周期的类。我应该有一个 FooRepository 实例来在应用程序的生命周期内将
我有一个接口(interface) ISession,其实例由不同的 session 工厂生成,具体取决于类所属的命名空间。 我的组件注册示例: IWindsorContainer container
我有一个看似简单的用例。有一个 ICsvReader 组件。让我们在这里简单地将它命名为 Reader。我们加载了一组已知的 CSV 文件,其中一些有标题,有些没有。目前有多个阅读器:Reader_S
这是我在 Global.asax 中的代码 WindsorContainer container = new WindsorContainer(); container.Register(Compo
在使用 ArrayResolver 时,如果我注册了一个接口(interface)的多个实现和一个依赖于所述接口(interface)数组的类,我希望数组解析器注入(inject)所有可以成功解析的接
有没有人有一些使用城堡 Windsor InstallerFactory 来订购安装程序的示例代码? 似乎无法在文档或其他地方找到它。 干杯 最佳答案 您只能使用 InstallerFactory与
documentation 中有说明你应该总是让拦截器 transient 。如果我有这个示例代码; //register interceptor container.Register(Classes
我有一点问题。我在 CaSTLe Windsor IOC Container 工作。现在我想做的只是弄乱一些 AOP 原则,而我特别想做的是基于方法名称执行一些日志记录。我一直在研究拦截器,目前我正在
有人对使用 CaSTLe DynamicProxy 拦截属性的更好方法有什么建议吗? 具体来说,我需要我正在拦截的 PropertyInfo,但它不是直接在 IInvocation 上,所以我要做的是
使用 ArrayResolver 时,如果我注册了多个实现相同接口(interface)的依赖项,并且我已经注册了依赖于这些依赖项数组的类,那么人们会期望 ServiceOverrides 受到尊重并
如何使用 Windsor 容器将 appSettings 条目的值(来自 app.config 或 web.config)注入(inject)服务?如果我想将 Windsor 属性的值注入(injec
我是一名优秀的程序员,十分优秀!