Categories

Links

visual j# -编译 BouncyCastle JCE

关于BouncyCastle JCE 请参见csdn中的一系列文章
http://www.csdn.net/Develop/article/23/23830.shtm
http://www.csdn.net/Develop/article/23/23831.shtm
http://www.csdn.net/Develop/article/23/23813.shtm
http://www.csdn.net/develop/article/24/24136.shtm
http://www.csdn.net/develop/article/24/24137.shtm
http://www.csdn.net/develop/article/24/24138.shtm

我们要从首先要从BouncyCastle的网站下载其jdk 1.1版本

展开到一磁盘目录,如c:\jce-jdk11-122

创建一个nant build文件
<project name="jce" default="build">
    <target name="build">
        <vjc target="library" output="jce.dll">
            <sources>
                <includes name="**/*.java"/>
            </sources>
        </vjc>
    </target>
</project>

运行build
有一些警告,主要是java目录中有些类重叠了,不用管它


使用bouncyCastle jce

对于java ,需要在安全属性文件java.security中增加一条
security.provider.x=org.bouncycastle.jce.provider.BouncyCastleProvider
注:x 是你的提供顺序号,你可能有多个提供者

对于visual j#,则需要在
winnt\microsoft.net\framework\你的.net framework 版本\
下创建一个vjsharp.config 文件
注意:第一个packageinfo是我们新增的
<jsharpconfiguration>
     <security>
          <packageinfo>
               <description>This package provides a security provider used in this sample</description>
               <loadinfo class="org.bouncycastle.jce.provider.BouncyCastleProvider,jce, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null, Custom=null">
                    <load/>
               </loadinfo>
          </packageinfo>
   <packageinfo>
               <description>This is the default security provider that ships with Visual J# .NET</description>
               <loadinfo class="com.ms.vjsharp.security.provider.ms, vjslib, Version=1.0.5000.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A, Custom=null">
                    <load/>
               </loadinfo>
          </packageinfo>
     </security>
</jsharpconfiguration>

接下去你可以在visual j#中运行csdn介绍文档中的一些代码了

推荐书
java 安全 第二版

[2004-02-18 15:51:07 | Author:jiangjianxiao ] [] 8 comments

.NET Framework 3.5 June 2007 中linq to sql 的新东西

.NET Framework 3.5 June 2007  中linq to sql 的新东西

1. 现在能够支持IDataErrorInfo接口了
早先主要是entity类不 支持this 索引属性

2. DataContext有个获得ChangeSet的方式了,大家可以看看早先是如何 通过reflect来获取的
http://dotnetslackers.com/articles/csharp/GettingChangedEntitiesFromLINQToSQLDataContext.aspx

现在就可以使用

  ChangeSet changeSet=db.GetChangeSet();
  foreach(Object obj in changeSet.RemovedEntities){
  }
  foreach(Object obj in changeSet.ModifiedEntities){
  }
  foreach(Object obj in changeSet.AddedEntities){
  }
 
3. entity的 OnValidate方法
在DataContext.SubmitChanges时触发,不过在我测试中发现很奇怪,就是entity没有改变它也触发了!!要是OnValidate中有访问数据库的行为,那还不要命,如果datacontext中有大量的entity的话.


写法很简单
public class YourEntity{

 private void OnValidate(){
  //你的validate逻辑
 }
}

 同样你可以实现OnLoaded ,这个方法在entity被load时被调用,在sqlmetal生成的代码中,OnValidate,OnLoaded是作为partial 方法声明的.

4. DataContext.CommandTimeout 

代理provider的CommandTimeout,其作用就不多说了

 

5. sqlmetal 生成的代码,有很大改变,现在,他为每一个属性都生成OnxxChanging和OnxxChanged partial method ,通过在构造函数中调用OnCreated partial 方法,你可以在partial  class 中实现改方法来达到类似DataTable.NewRow的效果. 注意 sqlmetal现在生成的代码使用了partial method 特性,关于partial method 大家可以参见 http://www.infoq.com/cn/news/2007/04/PartialMethods

 

以下是一些随手发现的东西

命名空间有改变,现在TableAttribute都被移动到Sytem.Data.Linq.Mapping,而StoreProcedureAttribute已经被删除,只使用Function

原来的System.Data.Linq.IPropertyChanging接口现在被移到到了System.ComponentModel中

IQueryable 已经没有CreateQuery,Execute方法了,现在这些由IQueryProvider的实现来完成,原来的动态查询的例子,source.CreateQuery,source.Execute都要相应的改为 source.Provider.CreateQuery,source.Provider.Execute才行

[2007-07-09 23:00:40 | Author:jiangjianxiao ] [] 5 comments

whidbey 中的sql server project

whidbey 中的sql server project  提供了在vs.net中创建.net sqlserver过程(存储过程、函数、触发器、自定义类型等) 的支持 ,鉴于此功能未见有人报道,可能大部分人都在手动在sql server 查询分析器中键入create assembly等(像我以前一样),所以特地提出来,使大家在测试yukon更容易一些。

New Project时的SQL Server Project

自动引用了Sqlaccess.dll和Microsoft.VisualStudio.DataTools.SqlAttributes.dll

 
add item
 

deply 功能 

SqlAssembly ,SqlFunc,SqlProcedure,SqlTrigger,SqlMapping 等attribute

这些attribute 可以帮助ide 在deply时
确定Assmebly名称

Create Assembly testyukon from 'xxxxx'
等价于
[assembly: SqlAssembly("testyukon")]
存储过程
默认的,存储过程的名称是方法名称,你可以使用
[SqlProcedure("newname"]
public void TestProcedure()
{
...
}  

重新指定
对于SqlTrigger ,则有Name,Target,ForClause属性
由于过于简单,所以不一一说明

 

关于 stinger

在我们都在等待yukon时,ibm已经在db2中引入了clr存储过程支持
代号为 Stinger  DB2 Development Add-In Technical Preview的一些特色得确不错
具体大家可以从dwcn上了解 链接

总有一种与比较yukon的冲动,我非常遗憾的看到,现在db2只支持在存储过程中使用.net assembly,而在 yukon中,支持扩展到自定义函数,存储过程,触发器,自定义数据类型,自定义聚集函数等

stinger引入clr的技术和yukon是相似的,比方说都有一个context对象(yukon是SqlContext而db2是DB2Context),但返回数据,yukon通过一个SqlPipe来实现,而db2好像就是默认什么都不做,这至少有些令人迷惑

DB2

public static void StoredProcedure1 ()
    {
        DB2Command cmd = DB2Context.GetCommand ();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "select * from customer";
       
        DB2DataReader reader=cmd.ExecuteReader();
 }
SqlServer

[SqlProcedure("TestProcedure")]
    public static void StoredProcedure1 ()
    {
        SqlCommand cmd = SqlContext.GetCommand ();
        cmd.CommandType = CommandType.Text;
        cmd.CommandText = "select * from customer";
       
        SqlDataReader reader=cmd.ExecuteReader();
        SqlPipe pipe = SqlContext.GetPipe ();
        cmd.Dispose ();
        pipe.Send (reader);

    }

 

通过attribute(sql server)和通过wizard(db2)进行deply各有所长,个人无法评判,感觉sql server采用attribute的方法更简捷


对设计的思考
yukon引入.net clr,可能使许多人会有把商业逻辑引入存储过程、触发器等sql元素的冲动,对于我而言,早先e2 erp核心都是基于sql server触发器和存储过程构造,前台使用pb,我直觉的感觉yukon会是升级这个系统的最好选择。但是,请大家注意

1、.net创建的这些sql元素,采用的是static(shared)方法,还是类似于过程式编码。如何将一些设计模式和面向对象的好处引入到这些项目,是我们主要要考虑的问题
2、在beta版本中,SqlContext.GetTransaction还是未支持状态,虽然可以使用

SqlTransaction trans=SqlContext.GetConnection().BeginTransaction() ;

获得一个新事务
3、如果将大量的商业逻辑引入其中,对数据库性能可能会有一定的冲击。而不是大家所想像的更好(可以预见的是,长时间的占用一个连接,锁定等)

所以,推荐大家按项目的实际情况而定,即,如果你有大量的代码在存储过程,触发器,移动到.net过程会使之更容易维护和升级,而如果仅仅是薄薄的一层(现在一般的模式都会使用存储过程包装数据操作,如有个category表,则对应的有addcategory,deletecategory,updatecategory等存储过程),则不必要进行这种迁移。而不是盲目迁移

[2004-01-31 19:53:24 | Author:jiangjianxiao ] [] 8 comments

OnTableNewRow 的怪异举止

显然,同一般的.net OnXX行为不同 ,通常的OnXX 会检查XX事件是否有设置,有的话就执行.

这段代码在DataTable.NewRow 中被调用

private void NewRowCreated(DataRow row)
{
if (this.onTableNewRowDelegate != null)
{
DataTableNewRowEventArgs e = new DataTableNewRowEventArgs(row);
this.OnTableNewRow(e);
}
}
protected virtual void OnTableNewRow(DataTableNewRowEventArgs e)
{
if (this.onTableNewRowDelegate != null)
{
Bid.Trace("<ds.DataTable.OnTableNewRow|INFO> %d#\n", this.ObjectID);
this.onTableNewRowDelegate(this, e);
}
}


大家可以看到,NewRowCreated中在检查onTableNewRowDelegate了,如果这个没有设置,则OnTableNewRow是不会被触发的,因此, 比方说你想要一个自定义的事件,比方说 NewEntity ,你无法在OnTableNewRow来挂接它. 你要先挂接TableNewRow事件,然后这个OnTableNewRow才能生效.这不是开玩笑吗?
      //protected override void OnTableNewRow(DataTableNewRowEventArgs e)
        //{
        //    base.OnTableNewRow(e);
        //    if (this.NewEntity != null)
        //        this.NewEntity(this, new NewEntityEventArgs<T>((T)e.Row));
        //}

[2007-11-11 10:43:01 | Author:jiangjianxiao ] [] 8 comments

asp.net mvc笔记- 替换自己的view engine,依赖注入

使用自己的view引擎


asp.net mvc 的view引擎提供对asp.net page,usercontrol 的的支持. 你还可以创建自己的view引擎,过程非常简单1. 实现IView接口,比方说
public class NVelocityView : IView
{
    public string ViewName
    {
        get;
        set;
    }
    public string MasterName
    {
        get;
        set;
    }
    public object ViewData
    {
        get;
        set;
    }
   
    public void RenderView(ViewContext viewContext)
    {
        //用nvelocity解析模板,这个任务留给大家完成
        string context = string.Empty;
        context = "解析后的内容";

        viewContext.HttpContext.Response.Write(context);

    }

}

2. 实现IViewFactory接口
public class NVelocityViewFactory : IViewFactory
{
   

    public IView CreateView(ControllerContext controllerContext, string viewName, string masterName, object viewData)
    {

        return  new NVelocityView { ViewName = viewName ,MasterName=masterName,ViewData=viewData};
       
      
    }

 
}
3. 继承Controller类,在类构造中设置ViewFactory参数
public class HomeController : Controller
{
    public HomeController()
    {
        ViewFactory = new NVelocityViewFactory();
    }
    [ControllerAction]
    public void Index()
    {
    }
}

依赖注入

4. 实现 IControllerFactory
在这里进行依赖注入,比方说调用
public class SpringControlFactory : IControllerFactory
{

 
    public IController CreateController(RequestContext context, System.Type controllerType)
    {
        string requiredString = (string)context.RouteData.Values["controller"];
        return (IController)ContextRegistry.GetContext()[requiredString];

    }

}
5. 设置controlerfactory
代码放到global.asax 的Application_Start中
 
ControllerBuilder.Current.SetDefaultControllerFactory( typeof(SpringControlFactory));
更新 ControllerBuilder提供了SetControllerFactory和SetDefaultControllerFactory两个方法, 通常,SetControllerFactory是针对特定的controller类型的, 在这个场景,你想对所有的controller子类生效,就用 SetDefaultControllerFactory

通过依赖注入,我们可以在外部实现修改ViewFactory的功能
<object id="myViewFactory" type="xxx.NVelocityViewFactory,xxx"/>
<object id='Home' type="xxx.HomeController,xxx" singleton="false">
<property name="ViewFactory" ref="myViewFactory"/>
</object>

IControllerFactory 非常重要, 这里,你可以使用dlr ,整合ironpython和ironruby,因为你已经得到controller名,接下来你可以从文件系统中读取对应的ironpython或ironruby 文件,编译和执行它,返回给asp.net mvc
这个链接 描述了如何host ironruby 2.0 r6
http://blogs.msdn.com/rdawson/archive/2007/11/29/hosting-ironpython-2-0-alpha-6-via-the-dlr.aspx
而codeplex 上有个nwsgi 项目, 你可以参考如何使用ironpython来达成在asp.net实现一个wsgi实现的


大家可以看到,继承自己的view引擎和ioc功能和整合动态语言是非常简单的, asp.net mvc 只是提供了一个简单的层次.对于类似castle 项目,两者更多的是互补而不是竞争.比方说castle的route功能不强 ,orm 不足,更多的是缺少社区的关注.  利用asp.net mvc ,castle 可以更多的将眼光关注到具体的领域问题上.


[2007-11-26 18:03:58 | Author:jiangjianxiao ] [] 6 comments

Total 5 Display 1 of 5
Powered by Google App Engine