BloodyAngel 把智能部署写的比较清楚了《信息系统开发平台OpenExpressApp - ClickOnce智能部署》,我在这里再进行一些补充。

  如果用过OpenExpressApp, 会知道客户端和服务器端都有一个统一的Library目录用来存放类库文件,客户端有个Module目录用来存放模块程序集文件,这样做的原因是可以很好 的部署框架。OEA可以发布ClickOnce客户端版本,第三方应用时只需要把特定项目应用的程序集拷贝到这两个目录即可。本篇主要描述一下部署相关内 容。

ExpressAppModule从Library目录装载类库元模型

  ExpressAppModule是OEA的内置模块,它继承与BaseModule,在Initialize放过中从指定的Library目录中获取类库程序集

Code
    public class ExpressAppModule : BaseModule
    {
        public ExpressAppModule(IUnityContainer container)
            : base(container)
        {
        }

        /// <summary>
        /// 加入Library目录下的业务模型 命令等
        /// </summary>
        public override void ()
        {
            base.Initialize();

            //查找Library目录下的所有程序集
            Directory.CreateDirectory(@".\Library");
            foreach (string fileName in Directory.GetFiles("Library", "*.dll"))
            {
                foreach (var item in Assembly.LoadFrom(fileName).GetTypes()
                    .Where(t => t.HasMarked<BusinessObjectAttribute>()))
                {
                    //加入业务模型 命令等
                    BusinessObjectInfo bOInfo = ApplicationModel.AddBusinessObject(item);
                    bOInfo.AddNotVisibleCommand();
                }
            }
        }
    }

定位.Net程序集文件

客户端从可访问的程序集中装载Command

Code
   /// <summary>
    /// Adapt commands
    /// </summary>
    public class WPFBaseModule : BaseModule
    {
        public WPFBaseModule(IUnityContainer container)
            : base(container)
        {
        }

        /// <summary>
        /// 把本程序集中,对于每一个标记了CommandAttribute的命令,
        /// 都构造CommandAdapter并加入到CommandRepository中。
        /// </summary>
        public override void Initialize()
        {
            if (this.GetType() != typeof(WPFBaseModule))
            {
                base.Initialize();
                var types = this.GetType().Assembly.GetTypes().Where(t => t.HasMarked<CommandAttribute>());
                foreach (var item in types)
                {
                    var ca = item.GetSingleAttribute<CommandAttribute>();

                    var coreCommand = ApplicationModel.Commands[];
                    var des = new CommandDescription(ca.Label, string.Empty, string.Empty, ca.ToolTip, string.Empty);
                    var adapter = new CommandAdapter(coreCommand, typeof(CommandRepository), des);

                    CommandRepository.Add(adapter);
                }
            }
        }
    }

服务器端从可访问的程序集中装载CSLA类库

CLR定位程序集时,将扫描应用程序的几个子目录。下面是CLR扫描一个语言中性的程序集顺序:
   1. Appbase\AsmName.dll
   2. Appbase\AsmName\AsmName.dll
   3. Appbase\privatePath\AsmName.dll
   4. Appbase\privatePath\AsmName\AsmName.dll
   5. Appbase\privatePath\AsmName.dll
   6. Appbase\privatePath\AsmName\AsmName.dll
  ……
对于privatePath需要在应用程序的配置文件中添加相应小节即可。配置文件必须位于应用程序的基目录中,名字必须是EXE文件名再加.config扩展名。OEA客户端和服务器的配置文件如下:

<runtime>
        <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
            <probing privatePath="Library;Module" />
        </assemblyBinding>
    </runtime>

 

客户端智能部署(ClickOnce)

  这个部署方式同微软模式应用小组开发项目中patterns & practices: Composite WPF and Silverlight 中使用的方式是一样的,具体的可以参考BloodyAngel 写的《信息系统开发平台OpenExpressApp - ClickOnce智能部署》

服务器端部署