Vitamin框架是建立在依賴注入思想上的輕型MVC框架锯玛,設(shè)計(jì)初衷是為了提高代碼的可讀性及提高開發(fā)效率踏烙。
C# 版本的框架實(shí)現(xiàn)网棍,是Unity游戲框架的基礎(chǔ)黔龟。
這是一個(gè)開源項(xiàng)目,你可以在這里獲取到:Vitamin MVC
特點(diǎn)
- MVC適度解耦
在不影響使用便捷和代碼可讀性的同時(shí)適度解耦滥玷,能夠降低代碼依賴氏身。 - 依賴注入
引用模塊更加方便 - 自動(dòng)初始化數(shù)據(jù)層
框架會(huì)自動(dòng)查找數(shù)據(jù)層相關(guān)依賴,調(diào)整初始化順序
示例
using System;
using System.Reflection;
using vitamin;
namespace test
{
class Program
{
static void Main(string[] args)
{
//初始化 維他命
Vitamin.initialize();
//Vitamin.reflex(typeof(ModelUser));
//從框架內(nèi)獲取一個(gè)視圖組件
ViewMain view = (ViewMain)Vitamin.getView(typeof(ViewMain));
//測試事件機(jī)制
view.on("ENTER",Program.eventHandler);
//視圖組件打開
view.enter();
Vitamin.delay(2000, delegate (object sender, System.Timers.ElapsedEventArgs e)
{
//視圖組件關(guān)閉
view.exit();
});
Console.ReadKey();
}
static private void eventHandler(params object[] args){
Logger.debug(args);
}
}
// 這是一個(gè) Commnad的實(shí)例
// 這里需要定義一個(gè)Command的路由 用于觸發(fā)Command
[CmdRoute("user.send")]
class CommandUser : CommandBase
{
//在Command可以注入任意的Model
[Model]
public ModelUser user;
//Command被執(zhí)行
public override void exec(params object[] args)
{
Logger.debug("CommandUser:"+this.user.name);
this.net.request(new TestMsg(), delegate (object data)
{
Logger.debug(data.ToString());
});
}
}
// 這是一個(gè) Model的實(shí)例
class ModelBag : ModelBase
{
//在Model可以注入除自身以外的任意的Model
[Model]
public ModelUser user;
public ModelBag()
{
}
//這里是Model的初始化方法惑畴,會(huì)在框架初始化之前被觸發(fā)
public override void initialize(){
Logger.debug("ModelBag:"+this.user.name);
}
}
// 這是另外一個(gè) Model的實(shí)例
class ModelUser : ModelBase
{
public string name = "【我是ModelUser】";
public ModelUser()
{
}
}
// 這是一個(gè)View的實(shí)例
class ViewMain : ViewBase
{
//在View里可以注入任意的Model
[Model]
public ModelUser user;
public ViewMain() { }
//視圖組件打開
public override void enter()
{
Logger.log("ViewMain:enter");
base.enter();
Logger.debug("ViewMain:"+this.user.name);
this.execCommand("user.send");
this.emit("ENTER", "event", "emit!");
}
//視圖組件關(guān)閉
public override void exit()
{
Logger.log("ViewMain:exit");
base.exit();
}
}
class TestMsg : IMsg
{
object __data;
public int routId { get { return 1001; } }
public int __id__ { get { return 0; } }
public object data { get { return this.__data; } set { this.__data = value; } }
}
}