你好,游客 登录 注册 搜索
背景:
阅读新闻

WPF+Nhibernate小项目总结 -

[日期:2013-03-22] 来源:  作者: [字体: ]

三三进销存系统项目总结

  1. 系统开发主要技术工具简述

本系统开发使用工具为Visual Studio 2010旗舰版,开发语言为C#, 开发平台为.net Frame Work 4,用户界面框架使用WPF,使用Nhibernate数据框架,数据库使用Sql Server 2008 R2,软件体系架构为三层架构(UI表示层,BLL业务逻辑层,DAL数据访问层),日志记录使用log4net,目的实现“高内聚,低耦合”的思想。

 

2. 用户界面框架WPF

2.1   WPF(Windows Presentation Foundation)布局。布局引入XAML(公开表示Windows应用程序用户界面的标记语言),个人感觉有HTML基础的会比较容易的上手。主要使用的布局控件有StackPanel、WrapPanel、DockPanel、Grid等控件,这些均为Panel基类的派生类。

2.2   WPF的数据绑定。WPF的数据绑定可以很容易的把数据从.Net对象传递给UI或从UI传递给.Net对象。

2.2.1          XAML的绑定语法。在XAML中主要使用Binding关键字,如

<TextBox Name="txtId" Width="90" Text="{Binding Id}"></TextBox>

, ComboBox等集合类控件的绑定方法为

<ComboBox Name="cbbStorage" DataContext="{Binding}" SelectedValue="{Binding Storage.Id}" SelectedValuePath="Id" DisplayMemberPath="Name" Width="80"></ComboBox>

2.2.2          在C#代码中的绑定方法。大多数控件可以直接将数据对象复制DataContext属性即可。部分控件(如ComboBox、ListView等集合类控件)控件可以将数据对象复制给ItemSource属性。

2.2.3          主从绑定。主从绑定实现显示选中项的详细信息,不用再做太多复杂的工作,可以直接将选中对象赋予DataContext。绑定方法为

DataContext="{Binding ElementName=控件名, Path=SelectedItem}"

,在指定的要详细显示的控件上{Binding 字段}即可。

2.2.4          字符串的格式化显示。时间字符串的格式化可以直接使用StringFormat,如将时间格式化为yyyy-MM-dd HH:mm:ss格式显示,可以

{Binding Time, StringFormat={}\{0:yyyy-MM-dd HH:mm:ss\}}

即可。也可以使用Converter类进行转换,例如要格式布尔类型的显示,可以新建类BoolConverter实现IValueConverter接口,然后定义本地资源

注意:使用local标签要先引入命名空间

然后在绑定对象上使用Converter ,如

Binding =”{Binding 字段, Converter={StaticResource boolConverter}}”

2.2.5          Binding的中文翻译在网上的专家之间争议比较大,在这里先暂时理解为数据绑定。

2.3   WPF自定义窗口形状。有时候为了界面的美观,使窗口的形状不局限于传统的矩形,WPF可以实现不规则的形状。将窗口的属性设置为WindowStyle="None" ResizeMode="NoResize" AllowsTransparency="True"即可以根据背景图的形状来显示窗口。如果要实现拖动可以在MouseLeftButtonDown事件中添加this.DragMove();代码。要实现关闭、最大化、最小化等功能,可以自己添加按钮实现即可。

2.4   WPF窗口的Aero效果

2.5   对于程序集属性的访问。

代码如下:

#region 程序集特性访问器(要引用System.Reflection命名空间)

 

        public string AssemblyTitle

        {

            get

            {

                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyTitleAttribute), false);

                if (attributes.Length > 0)

                {

                    AssemblyTitleAttribute titleAttribute = (AssemblyTitleAttribute)attributes[0];

                    if (titleAttribute.Title != "")

                    {

                        return titleAttribute.Title;

                    }

                }

                return System.IO.Path.GetFileNameWithoutExtension(Assembly.GetExecutingAssembly().CodeBase);

            }

        }

 

        public string AssemblyVersion

        {

            get

            {

                return Assembly.GetExecutingAssembly().GetName().Version.ToString();

            }

        }

 

        public string AssemblyDescription

        {

            get

            {

                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyDescriptionAttribute), false);

                if (attributes.Length == 0)

                {

                    return "";

                }

                return ((AssemblyDescriptionAttribute)attributes[0]).Description;

            }

        }

 

        public string AssemblyProduct

        {

            get

            {

                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyProductAttribute), false);

                if (attributes.Length == 0)

                {

                    return "";

                }

                return ((AssemblyProductAttribute)attributes[0]).Product;

            }

        }

 

        public string AssemblyCopyright

        {

            get

            {

                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false);

                if (attributes.Length == 0)

                {

                    return "";

                }

                return ((AssemblyCopyrightAttribute)attributes[0]).Copyright;

            }

        }

 

        public string AssemblyCompany

        {

            get

            {

                object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCompanyAttribute), false);

                if (attributes.Length == 0)

                {

                    return "";

                }

                return ((AssemblyCompanyAttribute)attributes[0]).Company;

            }

        }

        #endregion

 

3. 对系统配置文件APP.config的修改可以使用System.Configuration.ConfigurationManager类。

4. Nhibernate。博客园中有李永京的Nibernate之旅系列文章http://www.cnblogs.com/lyj/archive/2008/10/30/1323099.html,个人感觉将的很好,可以参考学习。我在这里只简单总结我的项目中的实际应用。我使用的是Nhibernate3.4.0版本。

4.1   使用到dll:

  

4.2   配置文件。可以新建hibernate.cfg.xml文件,也可以直接在App.config中配置。我是直接在App.config中配置的,具体配置如下:

 

<configSections>
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
  </configSections>
  <!--Nhibernate配置-->
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="connection.provider">
        NHibernate.Connection.DriverConnectionProvider
      </property>
      <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
      <property name="connection.connection_string">
        Database=SSS;Data Source=192.168.1.***;User Id=sa;Password=****
      </property>
      <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
      <property name="show_sql">true</property>
      <property name="query.substitutions">true 1, false 0, yes 'Y', no 'N'</property>
      <!--<property name="proxyfactory.factory_class">
        NHibernate.ByteCode.Castle.ProxyFactoryFactory,
        NHibernate.ByteCode.Castle
      </property>-->
      <mapping assembly="Com.SSS.Model" />
    </session-factory>
  </hibernate-configuration>

 

4.3   Mapping的配置。文件名为”实体.hbm.xml”,文件属性中的生成操作属性一定要为嵌入的资源,复制到输出目录属性是始终复制。

4.4   获取SessionFactory的方法为

ISessionFactory _sessionFactory = (new Configuration()).Configure().BuildSessionFactory();

,指定配置文件路径的获取SessionFactory的方法为

ISessionFactory _sessionFactory = (new Configuration()).Configure(文件路径).BuildSessionFactory();

。获取Session的方法为

ISession _session = _sessionFactory.OpenSession();

4.4.1          增加一个实体的方法

public TId Save(TEntity entity)

        {

            TId id = (TId)_session.Save(entity);

_session.Flush();//添加 _session.Flush();语句,防止主键不是数据库生成自动的实体没有及时insert到数据库中

            return id;

        }

4.4.2   更新一个实体,应该用到事务处理ITransaction,在_session.Update(entity)操作之前最好作_session.Clear()操作,是为了解决可能遇见的异常“a different object with the same identifier value was already associated with the session: 2, of class…“。

4.4.3   Projections提供了大量的SQL函数供使用。

4.4.4   如果一个方法中含有多条非查询语句的语句,建议使用存储过程或者事务处理,所有语句没有异常再提交,有异常则回滚。

5. log4net。版本为1.2.10

5.1 配置文件。在App.config的configSections中添加

<section name="log4net" type="log4net.Config.Log4NetConfigurationSectionHandler, log4net" />

,在configuration中添加

<!--log4net配置-->
<
log4net> <appender name="ConsoleAppender" type="log4net.Appender.ConsoleAppender, log4net"> <layout type="log4net.Layout.PatternLayout, log4net"> <param name="ConversionPattern" value="%d %p %m%n" /> </layout> </appender> <appender name="RollingFile" type="log4net.Appender.RollingFileAppender,log4net"> <param name="File" value="logs\log.zsm" /> <param name="AppendToFile" value="true" /> <param name="DatePattern" value="yyyy.MM.dd" /> <layout type="log4net.Layout.PatternLayout,log4net"> <conversionPattern value="%d %p %m%n" /> </layout> </appender> <root> <priority value="DEBUG" /> <appender-ref ref="ConsoleAppender" /> </root> <logger name="NHibernate" additivity="false"> <level value="WARN" /> <appender-ref ref="RollingFile" /> <appender-ref ref="ConsoleAppender" /> </logger> <logger name="NHibernate.SQL" additivity="false"> <level value="ALL" /> <appender-ref ref="RollingFile" /> <appender-ref ref="ConsoleAppender" /> </logger> </log4net>

 

5.2 必须在App.xaml.cs中的构造中添加

 public App() 
        {
            //log4net获取配置
            log4net.Config.XmlConfigurator.Configure();            
        }

6. office2010导出Excel.dll的方法:

    第一步:将Excel.exe生成Interop.Excel.dll。生成办法:进入你的visual studio的sdk下的bin目录,找到TlbImp.exe文件,如果没有,请用光盘安装此文件,详细说明请参照MSDN。拷贝Excel.exe到该<bin>目录,点击“开始”——“运行”——输入“cmd”进入命令行方式——进入<bin>目录

     ——输入“TlbImp /out:Interop.Excel.dll Excel.exe”,提示“Type library imported to Interop.Excel.dll路径”。此时应该可以在bin目录下找到Interop.Excel.dll文件。

第二步:在你的visual studio里点击:“你的项目——添加引用——浏览——找到该Interop.Excel.dll”——“确定”,即可完成引用。






收藏 推荐 打印 | 录入:admin | 阅读:
相关新闻