如何强制安装程序执行的顺序

时间:2011-06-15 13:14:26

标签: c#-4.0 dependency-injection inversion-of-control castle-windsor

我一直在构建一个新的.NET解决方案,而Castle正在执行我的DI。

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

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

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

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

我的问题 - 覆盖保存方法时 - 强制安装程序顺序的最佳方法是什么。

3 个答案:

答案 0 :(得分: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 :(得分:3)

您可以按照需要在Global.asax.cs中实例化的顺序调用安装程序,例如在Bootstrapper类中,从Global.asax.cs调用。

        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 - &gt; details,如果没有,则检查订单是否正确。

此解决方案快速简便,文档提到使用InstallerFactory类来更严格地控​​制安装程序,因此如果您有大量安装程序,则其他解决方案可能更适合。 (使用代码作为惯例不应该需要大量的安装程序?)

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

答案 2 :(得分:0)

最后,我必须使用InstallerFactory并按照之前的建议实施排序规则,方法是使用我的特定订单返回IEnumerable<Type>