繁体   English   中英

温莎城堡按名称空间注册,按名称键入

[英]Castle Windsor registration by namespace, keyed by name

我将Windsor用作IoC容器。 我想一口气在我的WPF应用程序中注册所有视图,按类型,UserControl解析并按视图名称键入键。 有没有比这更好的方法:

Assembly.GetExecutingAssembly().GetTypes()
    .Where(t => String.Equals(t.Namespace, "MyApp.Views", StringComparison.Ordinal))
    .ToList().ForEach(type => container.Register(Component.For<UserControl>()
    .ImplementedBy(type).Named(type.Name)
    .LifestyleTransient()));

我对命名空间的字符串并不感到疯狂,并且可能不需要遍历程序集中的所有类型。

关于什么

    container.Register(
        Classes.
.FromAssemblyContaining<OneOfYourView...>()
//.FromThisAssembly()
        .BasedOn<UserControl>()
.Configure(c=>c.LifestyleTransient())
        .Configure(c=>c.Named(c.Implementation.Name))

        .WithServiceSelf() // you can resolve by Type
        );

要对其进行一些改进,可以替换为:

Assembly.GetExecutingAssembly().GetTypes()

通过:

Assembly.GetExecutingAssembly().GetExportedTypes()

因此,私有类型不包括在组合中。

其次,查询中没有类型检查,因此可以注册任何类(甚至是抽象类或接口)。

 Assembly.GetExecutingAssembly().GetTypes()
 .Where(t => t.IsClass && !t.IsAbstract 
     && typeof(UserControl).IsAssignableFrom(t) 
     && t.Namespace.StartsWith("MyApp.Views", StringComparison.Ordinal)).ToList();

这将添加更多的安全防护,以确保只能注册可以作为UserControl解析的类型。

(请注意,我添加了:StarstWith而不是Equals,因为它还可以帮助具有更好的子文件夹/子命名空间层次结构,但这是视情况而定)。

最后,由于您使用Assembly.GetExecutingAssembly(),

这意味着您的应用程序取决于您的容器,建议将注册/解析移动到专用部件中。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM