当前位置:  编程技术>.net/c#/asp.net
本页文章导读:
    ▪【物联网智能网关-16】成功移植SQLite(STM32 .NET MF平台)      前言.NET Micro Framework系统官方代码是不支持任何数据库的,这对一些具有用户管理的Web Server、RFID数据采集和复杂的手持机应用来说是非常不方便的。很早就知道了SQLite,但是一直没有深入研.........
    ▪MVC中Code First编程一些小技巧      1. Code First 中实体类1. 主建字段 系统会自动以ID结束的这类创建主键,但有多个这种类型的字段还是指定一个为好[Key]public int DetailID { get; set; }2. 非空字段[Required,MaxLength(50)] //[StringLength(50)] .........
    ▪MVC扩展(ControllerFactory VS DependencyResolver)      MVC中两种实现DI的办法 ControllerFactory & DependencyResolver具体请参照 。DependencyResolver是MVC3中新增的专门用于实现DI的类。比起ControllerFactory1.实现代码更简单,职责更清晰。2.各种主流的IOC容器.........

[1]【物联网智能网关-16】成功移植SQLite(STM32 .NET MF平台)
    来源:    发布时间: 2013-10-28

前言

.NET Micro Framework系统官方代码是不支持任何数据库的,这对一些具有用户管理的Web Server、RFID数据采集和复杂的手持机应用来说是非常不方便的。

很早就知道了SQLite,但是一直没有深入研究,随着目前移植的.NET Micro Framework系统越来越成熟,用户对数据库支持的呼声也越来越高,迫切需要一个数据库平台了。考虑到移植难度和代码大小,最初原打算把YFIOs系统中的内存YFIODB数据库修改为文件版本,这样移植是最快的,代码也比较小,但是缺点是比较明显的,不支持Select等相关的SQL语句,这对熟悉数据库应用的用户来说,还需要重新了解数据库的操作方法,还不如用文件来实现了。

在这个过程中,也了解了其它的嵌入式数据库,如FastDB、Berkeley DB等开源嵌入式数据库,但其用户群和知名度远比不上SQLite,考虑到物联网中间件本身就是一个框架和平台,供用户二次开发,用户越熟悉的技术就应该优先选择。

确定了要移植SQLite数据库,但是又引出一个问题,是移植SQLite最新的版本?还是以前相对代码较小的版本?这着实让我踌躇了良久。

SQLite V2x和V3x比较

项目

V2.8.17

V3.7.15

API接口个数

44

207

源文件个数

44

89

源代码字节数

1.32M

4.0M

Win32 dll库大小

209K

591K

文本编码支持

UTF-8或iso8859

UTF-8、utf-8

二进制数据(Blob)

不支持

支持

行编号

32字节

64字节

并发性

多读,单写

改良的并发性

.NET Micro Framework的核心代码也不过300K左右,如果支持一个比自己核心还大的多的数据库,真有点小马拉大车的感觉,所以在满足基本功能的基础上(以前我比较担心V2x版本的国际化应用,比如是否支持中文),代码大小是我最关注的。

在Windows平台上对SQLite V2.8.17进行测试后,决定移植V2x版本的SQLite(当然后续不排除再移植3.0版本),移植成功后,release版本的 SQLite的大小大概130K左右。

SQLite V2x和V3x .NET Framework开发

考虑到.NET Micro Framework是.NET框架,所以最初研究的是System.Data.SQLite.dll库,后来发现,一是System.Data.SQLite.dll封装的太过复杂,二是System.Data.SQLite.dll对.NET Framework的框架非常依赖,并且针对不同平台,很难做到直接拷贝就可以使用(必须要安装),三是没有支持SQLite V2x的版本。

所以最后还是决定用Interop的方式直接访问Win32 的 SQLite.dll。网上搜索了一下,有关于SQLite3的相关示例,SQLite V2x的就没有了。所以先研究了一下SQLite3的接口应用,然后根据C++相关的接口定义,反推了一下SQLite V2x的C#接口。

在Windows .NET Framework平台测试SQLite V2x接口(如下图)没有问题的情况下,才开始进行.NET Micro Framework 平台下的SQLite V2x的移植。

 

SQLite V2x .NET Micro Framework移植

理论情况下,只需要对OS.c代码中的接口进行.NET MF的实现即可(标准的OS.c文件已经支持Windows,UNIX、Mac OS平台)。但实际移植发现,远没有这么简单。

(1)、SQLite代码都是标准的C语言,但是OS.c中需要调用.NET MF本身的C++代码操作接口,所以SQLite所有源码的c扩展名一律修改为cpp接口,采用cpp编译器进行编译,但是这样修改后,会出现很多编译错误,大都是类型转换的错误。

(2)、.NET Micro Framework平台不支持(或不建议)直接采用标准的string.h、ctype.h、math.h和stdio.h等头文件定义的函数。.NET Micro Framework代码中已经有部分字符串操作的实现,但是为了实现SQLite的正确编译,还必须自己补全相关操作函数。时间、文件等操作函数,也需要转换为.NET Micro Framework平台下的,或者自己实现。

(3)、内存分配相关函数.NET Micro Framework有两类,一种就是private_开头的函数,另外就是TinyCLR支持的内存操作函数,由于二者使用的堆空间不同(private_开头的操作Custom_Heap,这个一般都比较小),所以我调试的时候采用private_开头的函数,实际应用则是TinyCLR内存操作函数。把SQLite内存相关操作的函数,修改为.NET Micro Framework的。

(4)、由于.NET Micro Framework底层代码对文件的操作相对简单,所以SQLite产生的临时文件,我是在上层C#代码中进行清除的。

(5)、锁操作,.NET Micro Framework底层是无法对文件进行锁定操作的,考虑到.NET Micro Framework本身的特点(单进程,多线程),所以在上层C#代码中进行了简单的锁实现(该锁读写不能同时)。

(6)、SQLite指针应用的非常多,稍有不慎,系统就会出异常,所以在移植过程中,一定要研究透各种接口指针的实际含义(比如定义char ***p这类指针,我以前就很少遇到) ,否则调试过程将是一个噩梦。

SQLite.NET MF应用开发

   .NET MF C#接口又进行了封装,一是接口尽可能和System.Data.SQLite.dll兼容,二是做一些必要的内存释放和其它处理(如系统格式化,创建临时目录,磁盘刷新等等)。

   其实对相对简单的嵌入式应用来说,数据库无非就是建表,添加和修改数据,删除,获取表数据而已,而这些功能都可以通过SQL语句进行实现,所以说功能多,但是接口却很简单(如下图所示)。

 

测试代码如下:  

public static void Main()

{

string dbPath = "\\ROOT\\mftest.db";

using (SQLite db = new SQLite(dbPath)) //":memory:"))

{

//创建表

db.ExecuteNonQuery("CREATE TABLE student(id INTEGER, name VARCHAR(20), sex VARCHAR(2));");



//插入数据

db.ExecuteNonQuery("INSERT INTO student VALUES(1, '小红', '女');");

db.ExecuteNonQuery("INSERT INTO student VALUES(2, '小李', '男');");

db.ExecuteNonQuery("INSERT INTO student VALUES(3, '小明', '男');");



//读取表

YFDataTable table = db.ExecuteQuery("SELECT * FROM student");
    
[2]MVC中Code First编程一些小技巧
    来源:    发布时间: 2013-10-28

1. Code First 中实体类

1. 主建字段
系统会自动以ID结束的这类创建主键,但有多个这种类型的字段还是指定一个为好
[Key]
public int DetailID { get; set; }

2. 非空字段
[Required,MaxLength(50)]
//[StringLength(50)] 同上MaxLength
public string DetailTitle { get; set; }

3. 设置长度
[StringLength(500)]
public string DetailDesc { get; set; }

4. 设置外建字段
如果StyleID是Style表的主建,可以不用写Foreignkey属性
[Required, ForeignKey("Style")]
public int StyleID { get; set; }

外键关联的Entity
public virtual Style Style { get; set; }

5. 指定字段类型:
[Column(TypeName="Money")]
public decimal UnitPice { get; set; }

 

2. DBContext

public class StyleContext:DbContext
{
public StyleContext() : base("name=WMSAidDB")
{
//自动创建表,如果Entity有改到就更新到表结构
Database.SetInitializer<StyleContext>(new MigrateDatabaseToLatestVersion<StyleContext, ReportingDbMigrationsConfiguration>());
}

public DbSet<StyleDetail> StyleDetails { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
       modelBuilder.Entity<UnfulfilledOrderPart>().ToTable("tb_Order");//设置对应的表
       //设置对应的字段格式,长度,非空
            modelBuilder.Entity<UnfulfilledOrderPart>().Property(p => p.OrderNumber).IsRequired().HasColumnType("Varchar").HasMaxLength(500);
modelBuilder.Conventions.Remove<PluralizingTableNameConvention>(); //表名为类名,不是上面带s的名字 //移除复数表名的契约
modelBuilder.Conventions.Remove<IncludeMetadataConvention>(); //不创建EdmMetadata表 //防止黑幕交易 要不然每次都要访问 EdmMetadata这个表
}

}

internal sealed class ReportingDbMigrationsConfiguration : DbMigrationsConfiguration<StyleContext>
{
public ReportingDbMigrationsConfiguration()
{
AutomaticMigrationsEnabled = true;//任何Model Class的修改將會直接更新DB
AutomaticMigrationDataLossAllowed = true;
}
}

 3.  延迟加载

EF是默认开启延迟加载,延迟加载的关系表中,必须建立表关系,也就是SQL的FK键

context.Styles.Include("StyleDetails").Where(p => p.ParentStyleID == ParentID);

 下载Demo

本文链接


    
[3]MVC扩展(ControllerFactory VS DependencyResolver)
    来源:    发布时间: 2013-10-28

MVC中两种实现DI的办法 ControllerFactory & DependencyResolver

具体请参照 。

DependencyResolver是MVC3中新增的专门用于实现DI的类。比起ControllerFactory

1.实现代码更简单,职责更清晰。

2.各种主流的IOC容器都实现了自己的IDependencyResolver,与MVC集成更容易。如果IDependencyResolver。自己实现一个也非常简单

使用spring.net实现IDependencyResolver。

public class SpringDependencyResolver : IDependencyResolver{

private IApplicationContext springContext;

public SpringDependencyResolver(IApplicationContext context){
springContext = context;
}

public object GetService (Type serviceType){
IDictionaryEnumerator di = springContext.GetObjectsOfType(serviceType).GetEnumerator();

di.MoveNext();
try{
return di.Value;
}catch(InvalidOperationException ioe){
return null;
}

public IEnumerable<object> GetServices(Type serviceType){
IDictionary dictionary = springContext.GetObjectsOfType(serviceType);
return dictionary.Cast<object>();
}
}

其他IOC容器。ninject ,autofac,Unity 都实现了自己的DependencyResolver

实现Demo

Global.asax 注意AutofacDependencyResolver和NinjectDependencyResolver

protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();

RegisterGlobalFilters(GlobalFilters.Filters);
RegisterRoutes(RouteTable.Routes);

NinJectResolver();
//AutofacResolver();
}

private void AutofacResolver()
{
var builder = new ContainerBuilder();
builder.RegisterType<MyService>().As<IService>();
builder.RegisterControllers(typeof(MvcApplication).Assembly);
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}

private void NinJectResolver()
{
IKernel kernel = new StandardKernel();
kernel.Bind<IService>().To<MyService>();
DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
}

分别用Ninject和Autofac实现DI。

 

Service:接口和实现

public interface IService
{
string Get();
}

public class MyService :IService
{
public string Get()
{
return "Hello World";
}
}

Controller

public class HomeController : Controller
{
private IService _service;
public HomeController(IService service)
{
_service = service;
}

public ActionResult Index()
{
ViewBag.Message = _service.Get();
return View();
}

public ActionResult About()
{
return View();
}
}

Controller构造器注入Service。

下载Demo

总结:就这样非常容易的实现了DI。都要归功于MVC强大的可扩展性

本文链接


    
最新技术文章:
▪C#通过IComparable实现ListT.sort()排序
▪C#实现对Json字符串处理实例
▪Winform实现抓取web页面内容的方法
▪Winform实现将网页生成图片的方法
▪C#控制台程序中处理2个关闭事件的代码实例
▪WinForm实现同时让两个窗体有激活效果的特效...
▪WinForm实现拦截窗体上各个部位的点击特效实...
▪用C#的params关键字实现方法形参个数可变示例
▪C#判断某程序是否运行的方法
▪C#验证码识别基础方法实例分析
▪C#通过WIN32 API实现嵌入程序窗体
▪C#实现获取鼠标句柄的方法
▪C#事件处理和委托event delegate实例简述
▪C#获取程序文件相关信息的方法
▪C#中的除法运算符与VB.NET中的除法运算符
▪ASP.NET MVC 5使用X.PagedList.Mvc进行分页教程(PagedLi...
▪Base64编码解码原理及C#编程实例
▪C#实现的优酷真实视频地址解析功能(2014新算...
▪C#和SQL实现的字符串相似度计算代码分享
▪C#使用Word中的内置对话框实例
▪C#反射之基础应用实例总结
▪C#生成单页静态页简单实例
▪C#实现SMTP邮件发送程序实例
▪C#实现随鼠标移动窗体实例
▪C#使用GDI+创建缩略图实例
▪C#实现通过模板自动创建Word文档的方法
▪C#中Response.Write常见问题汇总
▪C#中多态、重载、重写区别分析
▪WinFrom中label背景透明的实现方法
▪C#中out保留字用法实例分析
 


站内导航:


特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

©2012-2021,,E-mail:www_#163.com(请将#改为@)

浙ICP备11055608号-3