返回首页

介绍
{A}(CBO的扩展)是一个对象,可扩展的框架。它的工作原理与接口和扩展对象直接。 CBO的扩展,可用于扩展。NET Framework的任何接口方法,包括来自第三方的接口,由您定义或接口。它是一种通用的对象添加附加行为的对象的接口方法的功能的工具。
在这篇文章中,我将讨论如何在CBO Extender是用来做交易的管理。首先,一组操作(命令)中定义了几个部分组成。然后,事务管理的各个方面的定义。最后,在各个方面都附加组件的对象,在应用程序中形成的交易。背景
事务可以定义多个操作组成的一个不可分割的工作单位,必须执行全部或其中为了保持数据的完整性。一个操作本身是不知道什么其他的操作都在一个事务的参与。一个交易是指个体经营后,已设计。根据业务需求,个人的行动可能会或可能不会被交易。当操作不明确指定交易,操作的行为就像是在其自己的事务。当操作中明确指定的交易,或在交易中的操作执行。
CBO的扩展已被用来添加到对象的行为,如日志记录,安全检查,排序等,。你可以找到它是如何做的文章{A2的}。在这篇文章中,我讨论了如何使用CBO的扩展做交易的管理。在这里,我们尝试编写一个应用程序[销售] [SalesOrderHeader资料]和[销售] [SalesOrderDetail资料]表中插入一个记录与Microsoft SQL Server附带的AdventureWorks数据库。定义了两个操作:插入[销售]一些数据的SalesOrderHeader,插入[销售]其他额外的数据。SalesOrderDetail资料。第二次手术的数据取决于第一个操作的数据。为了保持数据的完整性,这两个操作在一个事务中。
我们开始设计应用程序中插入两个表,不考虑交易。然后,我们定义的某些方面的交易能力修改应用程序。两种不同的方法用于交易功能添加到应用程序:使用CreateProxy和使用AOPContainer的。
注:CBO的扩展已经作为NuGet包上传。你可以下载并添加到您的项目从Visual Studio 2010。您也可以下载源代码, 最新的更新,更多的例子{A3}(http://centurytechs.com/products/CBOExtender.zip)。
CBOExtender若要从Visual Studio 2010安装到您的项目,点击工具-GT;图书馆软件包管理器-GT;管理NuGet软件包...打开管理NuGet软件包对话。所示类型CBOExtender。
{S0的}
你可能需要{A4纸}为Visual Studio 2010才可以下载包。使用代码
ADO.NET与SQL Server,操作是一个SqlCommand的方法。其中有一个单一的财产提出一个的接口ISqlOperation,SQL Server操作,定义如下。

public interface ISqlOperation

{

    SqlCommand Command { get; set; }

}

组件的Order和OrderDetail对应表中的记录[销售] [SalesOrderHeader资料]和[销售] [SalesOrderDetail资料],分别在表的记录,并定义如下:{C}
IOrder的接口定义在表中的字段对应的一组属性[销售] [SalesOrderHeader资料]和方法InsertOrder。为了实现两个的IOrder接口和ISqlOperation的接口。内订单InsertOrder,记录被插入到表中的[销售] [SalesOrderHeader资料]。
public interface IOrderDetail

{

    int SalesOrderID { get; set; }

    int OrderQty { get; set; }

    int ProductID { get; set; }

    int SpecialOfferID { get; set; }

    double UnitPrice { get; set; }



    int InsertOrderDetail();

}

    

public class OrderDetail : IOrderDetail, ISqlOperation

{

    public int SalesOrderID { get; set; }

    public int OrderQty { get; set; }

    public int ProductID { get; set; }

    public int SpecialOfferID { get; set; }

    public double UnitPrice { get; set; }



    private SqlCommand commd;

    public SqlCommand Command

    {

        get { return commd; }

        set { commd = value; }

    }



    public int InsertOrderDetail()

    {

        string sqlStr = @"INSERT INTO [Sales].[SalesOrderDetail] ([SalesOrderID], " + 

          @"[OrderQty], [ProductID], [SpecialOfferID], [UnitPrice]) " + 

          @"values (@orderID, @OrderQty, @ProductID, @SpecialOfferID, @UnitPrice)";



        commd.CommandText = sqlStr;

        commd.CommandType = CommandType.Text;



        SqlParameter orderIDParameter = new SqlParameter("@orderID", SqlDbType.Int);

        orderIDParameter.Direction = ParameterDirection.Input;

        orderIDParameter.Value = SalesOrderID;

        commd.Parameters.Add(orderIDParameter);



        SqlParameter OrderQtyParameter = new SqlParameter("@OrderQty", SqlDbType.Int);

        OrderQtyParameter.Direction = ParameterDirection.Input;

        OrderQtyParameter.Value = OrderQty;

        commd.Parameters.Add(OrderQtyParameter);



        SqlParameter ProductIDParameter = new SqlParameter("@ProductID", SqlDbType.Int);

        ProductIDParameter.Direction = ParameterDirection.Input;

        ProductIDParameter.Value = ProductID;

        commd.Parameters.Add(ProductIDParameter);



        SqlParameter SpecialOfferIDParameter = new SqlParameter("@SpecialOfferID", SqlDbType.Int);

        SpecialOfferIDParameter.Direction = ParameterDirection.Input;

        SpecialOfferIDParameter.Value = SpecialOfferID;

        commd.Parameters.Add(SpecialOfferIDParameter);



        SqlParameter UnitPriceParameter = new SqlParameter("@UnitPrice", SqlDbType.Float);

        UnitPriceParameter.Direction = ParameterDirection.Input;

        UnitPriceParameter.Value = UnitPrice;

        commd.Parameters.Add(UnitPriceParameter);



        return commd.ExecuteNonQuery();

    }

}

的IOrderDetail接口定义一组属性对应表中的字段[销售] [SalesOrderDetail资料和方法InsertOrderDetail。 OrderDetail实现两个IOrderDetail界面以及ISqlOperation的接口。内的OrderDetail InsertOrderDetail,记录被插入到表中的[销售] [SalesOrderDetail资料]。
随着订单和OrderDetail定义,我们写一个控制台应用程序使用它们插入到两个表的一些数据。应用程序代码被列为如下。{体C3}
在每个表执行时,[销售] [SalesOrderHeader资料]和[销售] [SalesOrderDetail资料]插入一个记录。如果我们注释行/ /抛出新的异常();,并再次执行代码,第一个表中插入一条记录,但不是在第二个表。不好,我们只有部分数据与数据库中的数据完整性问题!
因此,我们需要在一个事务中的两个操作的情况下,他们要么失败,数据库将回滚到原来的状态。
在以下的章节中,我们首先定义事务管理的某些方面。然后,两种不同的方法用于添加交易功能该应用程序。它们分别是:使用CreateProxy和使用AOPContainer的,分别。定义交易方面
在继续之前,我们需要在背景部分所述的指示后,CBO的扩展项目作为NuGet包安装。现在,让我们定义事务管理的某些方面。我们需要加入交易对象的一个​​方面。我们还需要一个对象的一个​​方面提交事务。这些方面的定义如下。{的C4}
JoinSqlTransaction方面注册了一个命令来传递参数参数的第一个元素的一个交易。它只能连接到目标实现的ISqlOperation接口。这方面可以应用到多个对象,以形成一个交易通过为每个对象的预处理方面。
CommitSqlTransaction方面犯了交易。它只能连接到一个目标,即实现ISqlOperation接口。只有在交易的最后一个对象,应使用它作为它的后处理方面。 使用CreateProxy
的定义方面,CreateProxylt; TGT;方法是将它们附加到对象。控制台应用程序现在看起来:
应用程序中有一些变化。首先,通过调用SqlConnection的BeginTransaction方法开始事务。第二,前调用Order组件,CreateProxylt InsertOrder方法; IOrdergt;被称为附加作为交易对象的预处理方面的订单对象o JoinSqlTransaction作为一个参数。第三,前调用InsertOrderDetail的OrderDetail组件,CreateProxylt的方法的; IOrderDetailgt的;被称为重视与预处理方面JoinSqlTransaction OrderDetail对象OD交易对象作为参数。和也,CommitSqlTransaction连接到相同的对象作为一个后处理方面。
执行时,记录被插入到每个[销售] [SalesOrderHeader资料]和[销售] [SalesOrderDetail资料]表。取消对行/ /抛出新的异常(),并再次执行,并没有记录被插入到表中。事务回滚和数据的完整性得以保留。
注意,交易功能添加附加的对象等方面的应用。没有变化是在组件的订单和OrderDetail。使用AOPContainer
应用程序被改写使用温莎集装箱和Unity容器AOPContainer。被列为如下代码。{5233}
由于AOPContainer中IoC容器提供一个共同的应用程序编程接口,事务管理是相同的,无论使用IoC容器。并使用相同的组件和方面。 AOPContainer.ChainAspect是用来连接对象方面这个时候,虽然我们仍然可以使用ObjectProxyFactory.CreateProxy。景点事务管理是通过扩展对象,而不是延长组件更容易。交易能力提出了几个方面的方法。通过交易,无视组件设计,系统更灵活,更需要较少的维护。可用于任何交易与AOP容器管理的IoC容器相同的组件和方面。

回答

评论会员:imgen 时间:2012/02/07
马丽娟。面向方面的编程简单
评论会员:加里Ĥ郭 时间:2012/02/07
谢谢你

我想你可能是在另一个文章A5}感兴趣。它使CBO的扩展编程更简单,更灵活。

希望你会喜欢它。

的问候,

加里