不能算是一个成熟的框架,因此暂时还不能用于正式项目
mail:
Teddy,您好!
我目前打算做一个 Foo 小项目作为上手 NBear 的第一步。习惯上我会使用 TestDriven.NET 在类库阶段做单元测试来试验框架的能力。在 NBear 的中文手册中只见到了在 Web 阶段的『测试』方法,而且使用了 NBear 的 IoC 类库。
我在看 NBear 源代码的过程中有如下几个问题想请教:
1)看起来 NBear IOC 调用了 Castle IOC 容器,但 Castle 的IOC或AR均支持配置文件是项目的『嵌入资源』,请问 NBear 是否也支持呢?有没有 sample 可以提供呢?
2)能不能只使用 NBear 的持久化部分,而不使用任何 IOC 框架也可以正常使用 NBear 的持久化能力呢?
3)NBear 是否可以完全不写 Entity 的代码(包括Entity接口和QueryCode),仅仅在配置文件中定义 Entity ,在运行时 NBear 就会自动产生对象呢?(因为我现在手头有一个CMS项目,未来将会有越来越多未知数量的新的 Article 类型,且 Article的属性类型和数量也是未知的,所以希望不要每次都通过硬编码来实现CRUD)
4)在 NBear 代码中有如下两项不明白:
4.1)NBear.IoC.Service.ServiceFactory.LoadServiceFactoryConfiguration() 方法中:
object section = ConfigurationManager.GetSection("ServiceFactory");
if (section == null)
{
return new NBear.IoC.Service.Configuration.ServiceFactoryConfiguration();
}
不明白这段的意思。是否相当于每次肯定要先看看有没有 ServiceFactory 这个节点呢?这样的命中率会不会低了点呢?而且这样是不是规定了只能从 App.config or Web.config 中取得配置项呢?
4.2)NBear.IoC.Service.Configuration.ServiceFactoryConfiguration 类的定义:
public class ServiceFactoryConfiguration
{
public ServiceFactoryType Type = ServiceFactoryType.Local;
public RemotingChannelType Protocol = RemotingChannelType.HTTP;
public string Server = " 127.0.0.1";
public int Port = 8888;
public string ServiceMQName = "MMQ";
public bool Debug = true;
public int MaxTry = SimpleServiceContainer.DEFAULT_MAX_TRY_NUMBER ;
}
这样相当于固定了 Port 值,而且 Debug 恒为 true 。这样是否会影响性能呢?这两个值写死了的话,我真的不大敢用到项目里呢 ^_^
就这么多了,烦请抽空解答一下好吗?谢谢啦 ^_^
此致
礼!
Stephen Wong
2006-10-15
Stephen 你好,
关于你的问题:
1),2)NBear只在NBear.IoC这个组件中使用了Castle中的很小的IoC容器部分和最简单的配置文件使用格式,Castle的其他功能没有,也不会过多地集成。因此,嵌入资源在NBear中没有显示的集成支持,也完全可以不使用NBear.IoC而今使用NBear的持久化组件。
3)对于实体来讲,如果不能确定实体的数量和属性,那么,就不可能强类型地去引用和使用。我们可以想象一下,如果我们非要满足这个需求会是什么样子:一个可能是,还不如使用DataSet这样的弱类型数据集合,通过字符串指定键值来访问数据;要么则不可避免的需要在运行时动态编译(如asp.net2.0的Profile机制),但是,这也就造成了代码不能在预先编译时检查很多错误,这就丧失了强类型的好处。
其实,个人推荐如下实现你的这个需求:基于NBear,你完全可以递增的定义实体,并通过继承等机制来扩展。比如,先定义一些实体在一个程序集,以后有扩展了,再定义更多实体程序集,在新的组件中引用就好了。如果将来新的Article数量和属性未知,其实没关系,最起码,当你要使用它时,他们应该确定了吧,这是再定义就好了?否则,数据结构也不好设计。CRUD对于很多类似功能的实体,完全可以通过范型来抽象,那样的话,设计的好,是可以避免(甚至完全避免)硬编码的。
4.1)其实,所有的配置,web应用程序启动的时候只会被从config文件载入一次(这是.net framework做的),之后访问ConfigurationManager的话都是访问内存中的一个静态对象,因此开销是很小的。NBear提供的默认组件,默认情况下,ServiceFactory的配置节只能定义在Web.config或App.config中,但是如果你继承ServiceFactory,就完全可以以任何你希望的方式定义配置信息在任何地方了。目前的方式,只是NBear默认提供了一种方便的定义方式,但并不强迫于这样使用。未来我可能会有文章介绍如何非常方面的扩展NBear.IoC,涉及如何继承扩展ServiceFactory,修改分布算法,使用数据库MQ或MSMQ等外部MQ,自定义MQServer和ServiceHost程序的扩展等。
4.2)这一点你就更不用担心了,你列出的类定义代码只是在这个类的新实例初始化时的初始值,运行时,NBear会自动地用配置文件中的值覆盖这些值的,port,debug什么的当然会是实际你设置的值,不会总是这个默认值的,除非你希望使用默认值,而不在config中指定特殊值。
Teddy