自己写了个Ioc框架----SummerFramework
好吧 我承认idea来自于spring. 一直非常讨厌java, .net领域虽然有spring.net这个.net的迁移版本.但仍然非常sick.闲极无聊之际索性自己写了个Ioc框架,以此打法寂寞之感. 当然,要做到注入,光一个稳定的容器还是不够的,需要熟悉整个请求访问的流程. 尤其在asp.net(或mvc)中,这就更加重要了.
项目主页 http://summerframework.codeplex.com/ 希望广大牛人多提提意见建议
Project DescriptionA lightweight IOC framework in .net which can run in both Windows Form and Web Form.
You can create singleton or unsingleton serivce instance in a easier way !
Feature:
- Light weight IOC container. You can control your container easily!
- Enable in both Windows Application and Web Application
- Asp.net mvc enable (both in 1.0 and 2.0)
- Aop support
- More features to add...
这个项目我花了一个多月的时间,由于平时工作繁忙,未必有时间进行,到今天为止,也算是有了个雏形.为了做到Extensible,参考了不少牛人的代码,自己写代码水平也有所提高.在整个Ioc编写过程中,最为麻烦的其实并不在容器本身,而是在Singleton实现并且setProperty上.对于无状态的Service这本不是问题,但是如果是Page(asp.net)或则Controller(asp.net mvc)这就比较恶心.Context.ApplicationInstance当访问结束就被回收了. 而其属性本身访问是protected的,外部无法更改.或许解决这个办法只有自己写个类继承之,这样却会导致所有需要Singleton的类必须继承之,这不是我想要的.
因此,目前的版本只能对非状态型的Object做 Singleton.各位如果有所解决方案,可以告诉我.
总体上讲,这个Ioc还算是比较灵活的.
如果是web,无论是普通asp.net还是asp.net mvc只需要少量更改global.ascx便可实现了容器的加载.
{
protected void Application_Start(object sender, EventArgs e)
{
this.Extensions.Add(new SummerHttpApplication("context.xml"));
}
}
更改web.config,让我自己来处理请求而不是asp.net本身
<httpHandlers>
</httpHandlers>
或则
<httpModules>
<add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
<add name="UrlRoutingModule" type="Summer.Web.Mvc.UrlRoutingModule"/>
</httpModules>
通过配置xml,可以做到对指定aspx或controller进行service Setting或则在页面中可以直接取得相应注入服务的实例
public partial class _Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
var b = (DateTimeMakerService)this.GetDefaultContextObject("dateTimeMaker");
var c = b.Create();
Response.Write("DateTimeMakerService.Create is " + c );
}
}
public partial class _Default : System.Web.UI.Page
{
public DateTimeMakerService Time { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
Response.Write("DateTimeMakerService.Create is " + Time.Create());
}
}
static void Main()
{
SummerWindowsApplication summer = new SummerWindowsApplication("context.xml");
summer.ApplicationStart();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
Application.ApplicationExit += delegate(object sender, EventArgs e) { summer.ApplicationEnd(); };
}
在windows Form中的设置,则web类似,只需在Program.main方法中加载容器即可
-----------------------------------------------------------------------------------------------------------------
| 戴佳顺 | msn:edwin19861218@hotmail.com | QQ:1961218 | Web:http://www.dumuzi.cn |