如何通過AgileEAS.NET快速搭建屬於你的企業應用(二)——智能版本升級和多數據庫訪問的分布式部署


又過了一周,又是一周瑣碎事,周末閑下來繼續這個系列的第二部。

使用AgileEAS框架及輔助開發中間件把你的程序做好了,總要發布啊,由於我做的事winform形式的客戶端應用,所以自動更新是必不可少的,順道的,竟然說的是如何在服務器發布,那就一定要說說分布式通信。

分布式通信的好處自然是很多的,但對我來說,在讀取oracle數據庫的時候不用裝客戶端、訪問外單位服務器的時候可以控制訪問源這些都是極好的。

步入正題,通過第一篇的介紹,相信各位對於這個框架的用法肯定有了一定的了解,通過orm、form設計器快速的建立一系列的基本模塊,組合了一些基礎功能,現在,我們需要把你的程序做成安裝包,然后通過SmartUpdate實現客戶端的自動更新,首先我們看一下上一篇中的一直沒用到的關鍵文件夾 AppServer

image 

這個文件夾就是需要發布在服務器上的全部了,直接拷到你的服務器上吧,看看里面都有些啥

image

Bin文件夾承載着EAS平台服務端的核心服務,通過這個服務,客戶端才能夠完成自動更新、分布式通信的功能,服務的開啟方法不多說,在葯店的案例和幫助pdf中都有詳細的描述,這里我們主要看一下下面這個配置文件:

image

代碼如下:

<?xml version="1.0"?>
<configuration>
  <configSections>
    <section name="eas" type="EAS.ConfigHandler,EAS.MicroKernel"/>
  </configSections>
  <eas>
    <configurations>
      <item name="Key"  value="Value"/>
    </configurations>
    <soa>
      <config httpPort="8088" tcpPort="6688"/>
      <services>
        <service key="EAS.RMIService" type="EAS.Distributed.RMIService,EAS.Distributed.ServiceHost"/>
        <service key="EAS.UpdateService" type="EAS.SmartUpdate.UpdateService,EAS.Distributed.ServiceHost"/>
        <service key="EAS.StorageService" type="EAS.FileStorage.StorageService,EAS.Distributed.ServiceHost"/>
      </services>
    </soa>
    <objects>
      <!--定義數據訪問相關組件。-->
      <object name="DbProvider" assembly="EAS.Data" type="EAS.Data.Access.SqlClientProvider" LifestyleType="Thread">
        <property name="ConnectionString" type="string" value="Data Source=192.168.8.81\SQLEXPRESS;Initial Catalog=liantie;User ID=sa;Password=Furnace123" />
      </object>
      <object name="DataAccessor" assembly="EAS.Data" type="EAS.Data.Access.DataAccessor" LifestyleType="Thread">
        <property name="DbProvider" type="object" value="DbProvider"/>
        <property name="Language" type="object" value="TSqlLanguage"/>
      </object>
      <object name="OrmAccessor" assembly="EAS.Data" type="EAS.Data.ORM.OrmAccessor" LifestyleType="Thread">
        <property name="DataAccessor" type="object" value="DataAccessor"/>
      </object>
      <object name="ServiceBridger" assembly="EAS.MicroKernel" type="EAS.Services.LocalServiceBridger" LifestyleType="Thread" />
      <object name="Logger" assembly="EAS.MicroKernel" type="EAS.Services.TextLogger" LifestyleType="Singleton">
        <property name="Path" type="string" value="E:\程序\AppServer\logs" />
      </object>
      <!--分布式服務上下文參數定義。-->
      <object name="EAS.Distributed.ServiceContext" type="EAS.Distributed.ServiceContext,EAS.Distributed.ServiceHost" LifestyleType="Singleton">
        <property name="MaxMemory" type="int" value="512" />
        <property name="StoragePath" type="string" value="E:\程序\AppServer\EMRFiles" />
        <property name="EnableLogging" type="bool" value="true" />
      </object>
      <!--ORACLE HBWL-->
      <object name="DbProvider2" assembly="EAS.Data.Provider" type="EAS.Data.Access.OracleProvider" LifestyleType="Thread">
        <property name="ConnectionString" type="string" value="Data Source=JZJL;User Id=query;Password=query" />
      </object>
      <object name="DataAccessor2" assembly="EAS.Data" type="EAS.Data.Access.DataAccessor" LifestyleType="Thread">
        <property name="DbProvider" type="object" value="DbProvider2"/>
        <property name="Language" type="object" value="PLSqlLanguage"/>
      </object>
      <object name="OrmAccessor2" assembly="EAS.Data" type="EAS.Data.ORM.OrmAccessor" LifestyleType="Singleton">
        <property name="DataAccessor" type="object" value="DataAccessor2"/>
      </object>
      <!--ORACLE LEV3-->
      <object name="DbProvider3" assembly="EAS.Data.Provider" type="EAS.Data.Access.OracleProvider" LifestyleType="Thread">
        <property name="ConnectionString" type="string" value="Data Source=LEV3;User Id=ltcx;Password=ltcx2009" />
      </object>
      <object name="DataAccessor3" assembly="EAS.Data" type="EAS.Data.Access.DataAccessor" LifestyleType="Thread">
        <property name="DbProvider" type="object" value="DbProvider3"/>
        <property name="Language" type="object" value="PLSqlLanguage"/>
      </object>
      <object name="OrmAccessor3" assembly="EAS.Data" type="EAS.Data.ORM.OrmAccessor" LifestyleType="Singleton">
        <property name="DataAccessor" type="object" value="DataAccessor3"/>
      </object>
      
      <object name="TSqlLanguage" assembly="EAS.Data" type="EAS.Data.Linq.TSqlLanguage" LifestyleType="Thread"/>
      <object name="PLSqlLanguage" assembly="EAS.Data.Provider" type="EAS.Data.Linq.PLSqlLanguage" LifestyleType="Thread"/>
    </objects>
  </eas>
  <startup>
    <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
  </startup>
</configuration>

上面的代碼中定義了3個數據庫連接,大家可以看到,他們分別是默認的MSSql連接,一個HBWL的Oracle數據連接,一個名叫LEV3的Oracle數據連接,在使用的時候,默認的數據庫連接可以通過直接使用中間件提供給你的數據查詢方式來進行查詢,另外兩個在使用的時候需要進行ORMDataAccessor的手動指定,代碼如下

        IDataAccessor da = EAS.Objects.ContainerBuilder.BuilderDefault().GetComponentInstance("DataAccessor3") as IDataAccessor;
        IOrmAccessor oa = EAS.Objects.ContainerBuilder.BuilderDefault().GetComponentInstance("OrmAccessor3") as IOrmAccessor;

        public IList<IronMES.Entities.QualityInfo.DD_JCGYSZLCX> DD_JCGYSZLCXList(DateTime dateTimeStart, DateTime dateTimeEnd, string materiel_code, string materiel, string provider)
        {
            DataEntityQuery<IronMES.Entities.QualityInfo.DD_JCGYSZLCX> query = DataEntityQuery<IronMES.Entities.QualityInfo.DD_JCGYSZLCX>.Create();

            query.DataAccessor = da;
            query.OrmAccessor = oa;

            var v = (from item in query
                     where (item.DICTATE_TIME >= dateTimeStart && item.DICTATE_TIME <= dateTimeEnd)
                     && (materiel_code.Trim().Length == 0 || item.MATERIEL_CODE.StartsWith(materiel_code))
                     && (materiel.Trim().Length == 0 || item.MATERIEL.Contains(materiel))
                     && (provider.Trim().Length == 0 || item.PROVIDER.Contains(provider))
                     orderby item.DICTATE_TIME descending
                     select item);

            return v.ToList();
        }

 

其實,細心的你一定發現了,這個配置文件和你項目中的appstart.config其實是一個類型的文件,它的主要功能就是定義了程序連接數據庫的配置信息和服務端的發布端口號之類的東西,直接復制即可(該配置為分布式通信部署的配置)。配置之后就安裝服務,win+r建,找到agileeas(服務名),啟動,以后如果有新的服務端更新就扔到這個文件夾里即可(粘貼之前停止服務,然后再啟動,無需重復安裝)。appserver/Bin里面需要放的文件有:Entities類庫、Contact接口類庫、Service服務類庫。

接下來是xClient文件夾,image

上面的無視,里面存的就是用於SmartUpdate的當前版本信息,下面這個Files是用來存放客戶端更新文件的,其實說白了,你就把你自己源碼里面Bin/DotNet4.0文件夾里的東西全拷過來即可。以后更新那個在拷哪個。然后用里面的介個工具更新一下config文件夾里面的xml,用法如下image

image

最后,為了順利的實現自動更新,你還需要修改一個客戶端配置文件,下面的文件是重點image

在服務器的xClient更新文件夾和你的安裝包中這個配置文件需要把Update值設為1(開啟更新),但是你自己的項目中也就是Bin/DotNet4.0中記得改成0,不然你每次調試都會更新,那就沒法調試了

最后還剩一個客戶端的appConfig的設置,下面直接放出分布式通信的配置文件,如果你不想要分布式通信,就按照上面服務端數據庫配置改一下你的客戶端appconfig即可。。。

 分布式通信的客戶端配置如下:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="eas" type="EAS.ConfigHandler,EAS.MicroKernel" />
  </configSections>
  <eas>
    <configurations>
      <item name="WorkstationUser" value="Administrator" />
      <item name="LastUser" value="Administrator" />
      <item name="SmartLogin" value="true" />
      <item name="SystemStyle" value="MdiStyle" />
      <item name="NavigationStyle" value="TreeStyle" />
      <item name="MultiInstance" value="Enabled" />
      <item name="EnableSkin" value="true" />
      <item name="SkinStyle" value="MacOS" />
    </configurations>
    <objects>
      <!--分布式通信組件。-->
      <object name="ServiceBridger" assembly="EAS.Distributed.Client" type="EAS.Distributed.ServiceBridger" LifestyleType="Singleton" >
        <property name="ServiceName" type="string" value="EAS.RMIService.Service" />
      </object>
      <object name="DataAccessor" assembly="EAS.Distributed.Client" type="EAS.Distributed.DataAccessor" LifestyleType="Singleton" >
        <property name="ServiceBridger" type="object" value="ServiceBridger" />
        <property name="Language" type="object" value="TSqlLanguage"/>
      </object>
      <object name="OrmAccessor" assembly="EAS.Distributed.Client" type="EAS.Distributed.OrmAccessor" LifestyleType="Singleton" >
        <property name="ServiceBridger" type="object" value="ServiceBridger" />
        <property name="DataAccessor" type="object" value="DataAccessor" />
      </object>
      <object name="TSqlLanguage" assembly="EAS.Data" type="EAS.Data.Linq.TSqlLanguage" LifestyleType="Thread"/>
      <!--日志管理-->
      <object name="Logger" assembly="EAS.MicroKernel" type="EAS.Services.TextLogger" LifestyleType="Singleton"/>
      <!--資源平台所需組件-->
      <object name="EAS.Explorer.DAL" assembly="EAS.Explorer.DAL.SQLServer" type="EAS.Explorer.DAL.SQLServer.DALManager" LifestyleType="Singleton" />
      <object name="EAS.Explorer.Resource" assembly="IronMES.Res" type="IronMES.Res.Resources" LifestyleType="Singleton" />
    </objects>
    <services>
      <service name="EAS.RMIService.Service" service-type="WcfService" singleton="true" url="net.tcp://192.168.8.81:6688/eas/services/EAS.RMIService" />
    </services>
  </eas>
  <runtime>
    <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
      <dependentAssembly>
        <assemblyIdentity name="EAS.MicroKernel" publicKeyToken="A550803C4CD9DBB5" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
      </dependentAssembly>
      <dependentAssembly>
        <assemblyIdentity name="EAS.Data" publicKeyToken="A550803C4CD9DBB5" culture="neutral"/>
        <bindingRedirect oldVersion="0.0.0.0-5.0.0.0" newVersion="5.0.0.0"/>
      </dependentAssembly>
    </assemblyBinding>
  </runtime>
</configuration>

 

下面看一個分布式訪問的例子吧

首先,修改你的GetList()如下,使用ServiceContainer來執行服務端的service,這里注意請把參數傳到服務端去,不要再服務端使用linq查詢類型。。。也就是DataEntityQuery,這個是不能序列化的哦。。。

  public void GetDataList(DateTime dateTimeStart,DateTime dateTimeEnd ,string materiel_code ,string materiel,string provider ) 
        { 
            var query = ServiceContainer.GetService<IOracleService>().DD_JCGYSZLCXList(dateTimeStart,dateTimeEnd ,materiel_code ,materiel,provider );
          
            this.vList = query.ToList(); 
        } 
  

接下來是服務端的Service

 public IList<IronMES.Entities.QualityInfo.DD_JCGYSZLCX> DD_JCGYSZLCXList(DateTime dateTimeStart, DateTime dateTimeEnd, string materiel_code, string materiel, string provider)
        {
            DataEntityQuery<IronMES.Entities.QualityInfo.DD_JCGYSZLCX> query = DataEntityQuery<IronMES.Entities.QualityInfo.DD_JCGYSZLCX>.Create();

            query.DataAccessor = da;
            query.OrmAccessor = oa;

            var v = (from item in query
                     where (item.DICTATE_TIME >= dateTimeStart && item.DICTATE_TIME <= dateTimeEnd)
                     && (materiel_code.Trim().Length == 0 || item.MATERIEL_CODE.StartsWith(materiel_code))
                     && (materiel.Trim().Length == 0 || item.MATERIEL.Contains(materiel))
                     && (provider.Trim().Length == 0 || item.PROVIDER.Contains(provider))
                     orderby item.DICTATE_TIME descending
                     select item);

            return v.ToList();
        }

這樣就可以實現多數據庫連接的分布式通信部署了。。。今天總覺的莫名其妙不太會講話了。。。哪里說的不明白的各位及時跟貼或聯系我,我會盡量給各位解答的,要是哪里說的不對歡迎各位大神的批評指正!

 

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM