8

我一直在用Castle执行我的DI构建新的.NET解决方案。如何强制执行安装程序的指令

它现在处于我想要控制安装程序运行顺序的阶段。我已经构建了实现IWindsorInstaller来处理我的核心类型的单个类 - 例如IRepository,IMapper和IService等等。

我看到它的建议我实现我自己的InstallerFactory(猜测我只是重写Select)在这个类中。

然后在我的电话使用这个新工厂:

FromAssembly.InDirectory(new AssemblyFilter("bin loca­tion")); 

我的问题 - 重写保存方法时 - 什么是强迫我安装顺序的最佳方式。

+0

手动添加安装在您需要的顺序?无论如何,你能告诉我们为什么你需要定义一个特定的订单吗? – 2011-06-15 13:49:26

+0

好吧,让我们假设我想保证Service安装程序首先运行(依赖关系图允许)。该文档说覆盖InstallerFactory是要走的路。这个话题似乎很少涉及。我认为最终归结为重新排序传递给Select方法的IEnumerable 2011-06-15 16:09:03

回答

21

我知道它已经解决了,但我无法找到如何真正实现任何例子InstallerFactory,所以这里有一个解决方案,如果有人正在使用它。

使用方法:

[InstallerPriority(0)] 
    public class ImportantInstallerToRunFirst : IWindsorInstaller 
    { 
     public void Install(IWindsorContainer container, Castle.MicroKernel.SubSystems.Configuration.IConfigurationStore store) 
     { 
      // do registrations 
     } 
    } 

只是一个优先添加InstallerPriority属性的“安装顺序敏感”类别。安装人员将按升序排序。没有优先安装程序将默认为100

如何实现:

public class WindsorBootstrap : InstallerFactory 
    { 

     public override IEnumerable<Type> Select(IEnumerable<Type> installerTypes) 
     { 
      var retval = installerTypes.OrderBy(x => this.GetPriority(x)); 
      return retval; 
     } 

     private int GetPriority(Type type) 
     { 
      var attribute = type.GetCustomAttributes(typeof(InstallerPriorityAttribute), false).FirstOrDefault() as InstallerPriorityAttribute; 
      return attribute != null ? attribute.Priority : InstallerPriorityAttribute.DefaultPriority; 
     } 

    } 


[AttributeUsage(AttributeTargets.Class)] 
    public sealed class InstallerPriorityAttribute : Attribute 
    { 
     public const int DefaultPriority = 100; 

     public int Priority { get; private set; } 
     public InstallerPriorityAttribute(int priority) 
     { 
      this.Priority = priority; 
     } 
    } 

当启动应用程序时,Global.asax的等:

container.Install(FromAssembly.This(new WindsorBootstrap())); 
+1

伟大的解决方案,谢谢! – 2012-04-18 09:11:45

+1

这是应该肯定合并到温莎的那种延伸点。做得好。 – M05Pr1mty 2013-03-19 10:21:13

+1

有趣的是,如果您正在注册来自不同程序集的安装程序,则此方法不起作用。安装程序工厂每个程序集调用一次。 – ScottG 2015-01-26 09:34:27

0

在最后,我不得不使用InstallerFactory和执行的顺序规则,预先用我特定的顺序返回IEnumerable<Type>建议

+0

您是否有链接到一些关于InstallerFactory的更多信息? – Chev 2012-01-28 06:16:25

+0

@Chev我没有发现太多的关于这方面的文章,我只是不得不使用试验和错误来获得我期待的结果。 – 2012-01-30 14:47:37

3

你可以打电话给你的安装顺序,他们需要在Global.asax.cs中实例化或例如在从Global.asax.cs调用的Bootstrapper类中。

 IWindsorContainer container = new WindsorContainer() 
      .Install(     
       new LoggerInstaller()   // No dependencies 
       , new PersistenceInstaller() // --""-- 
       , new RepositoriesInstaller() // Depends on Persistence 
       , new ServicesInstaller()  // Depends on Repositories 
       , new ControllersInstaller() // Depends on Services 
      ); 

他们被实例化的顺序,你可以后添加断点,并检查容器"Potentially misconfigured components"

如果有,请检查它们的Status - >details,如果没有,则它是正确的顺序。

该解决方案既快速又简单,文档中提到使用InstallerFactory类来更加严格地控制安装程序,所以如果您有大量的安装程序,那么其他解决方案可能会更好。 (使用代码作为公约不应该要求安装吨的?)

http://docs.castleproject.org/Windsor.Installers.ashx#codeInstallerFactorycode_class_4

+0

这确实可行,但是在导致这个问题的解决方案中,我们在库中引用了未知的安装程序,并且我们希望确保它们都会根据我们的约定被选中,但是按照特定的顺序运行 - 也是基于约定。 – 2013-06-03 15:47:05

相关问题