好吧 我承认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方法中加载容器即可