我一直在使用NHibernate一段时间,并且不时发现如果我尝试同时请求两个页面(或尽可能接近),它偶尔会出错.所以我认为这是因为我的会话管理不是线程安全的.
我认为这是我的课程,所以我尝试使用此博客文章中的不同方法http://pwigle.wordpress.com/2008/11/21/nhibernate-session-handling-in-aspnet-the-easy-way/但是我仍然遇到同样的问题.我得到的实际错误是:
Server Error in '/AvvioCMS' Application.
failed to lazily initialize a collection, no session or session was closed
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: NHibernate.LazyInitializationException: failed to lazily initialize a collection, no session or session was closed
Run Code Online (Sandbox Code Playgroud)
这个或没有datareader是开放的,但这是罪魁祸首.
我把会话管理课放在下面,有人能说出我为什么会遇到这些问题吗?
public interface IUnitOfWorkDataStore
{
object this[string key] { get; set; } …
Run Code Online (Sandbox Code Playgroud) 每当我尝试使用ActionLink时,我都会收到上述错误?我刚开始玩MVC并且不太了解代码的问题(下面):
<%= Html.ActionLink("Lists", "Index", "Lists"); %>
Run Code Online (Sandbox Code Playgroud)
这似乎只是一个解析问题,但只有在我运行页面时才会发生.应用程序构建完美,所以我真的不明白,因为错误是编译错误?如果我采取第25行,它将发生在下一行而不是......
Compilation Error
Description: An error occurred during the compilation of a resource required to service this request. Please review the following specific error details and modify your source code appropriately.
Compiler Error Message: CS1026: ) expected
Source Error:
Line 23: </div>
Line 24:
Line 25: <%= Html.ActionLink("Lists", "Index", "Lists"); %>
Line 26: <a href="<%= Url.Action("/", "Lists"); %>">Click here to view your lists</a>
Line 27:
Source File: d:\Coding\Playground\HowDidYouKnowMVCSoln\HowDidYouKnowMVC\Views\Home\Index.aspx Line: 25
Run Code Online (Sandbox Code Playgroud) 每当我有一个在不同网站/应用程序中使用的库时,我总是将库的项目添加到同一个解决方案中并从那里引用它.当需要在解决方案中进行调试时,这很好,但在所有其他情况下,它似乎毫无意义,并且在解决方案资源管理器中占用了更多空间.
另一个正面或负面的是,如果该库由公司中的其他人更新,然后我构建另一个使用相同的东西的应用程序,他们可能已经破坏了构建.如果出于某种原因无法使用当前应用程序修复,那么您可以返回到源代码控制并回滚到旧版本,但这似乎有点过于OTT.
我只是想知道其他人对这个问题的想法是什么.你通常做什么,参考dll或你是否将项目添加到您的解决方案.
你会如何测试这种情况?
我刚刚开始研究NHibernate并在TDD上进行了第一次打击.到目前为止,我真的很喜欢它,并且一直使用流畅的Nhibernate来映射类.
但是,当在PersistenceSpecification上使用VerifyTheMappings方法时,我似乎正在走向死胡同.
基本上我有两个类,Recipient和RecipientList.RecipientList类具有到收件人的映射,具有流畅的"HasMany"关系:
public class RecipientListMap : ClassMap<RecipientList>
{
public RecipientListMap()
{
Id(x => x.ID);
Map(x => x.ApplicationID);
Map(x => x.Name);
Map(x => x.IsDeleted);
HasMany<Recipient>(x => x.Recipients).WithKeyColumn("RecipientListID").AsList().LazyLoad();
}
}
Run Code Online (Sandbox Code Playgroud)
但是,当我在测试中使用以下代码时:
private IList<Recipient> _recipients = new List<Recipient>()
{
new Recipient { FirstName = "Joe", LastName = "Bloggs", Email = "joe@bloggs.com", IsDeleted = false },
new Recipient { FirstName = "John", LastName = "Doe", Email = "john@doe.com", IsDeleted = false },
new Recipient { FirstName = "Jane", LastName = "Smith", Email …
Run Code Online (Sandbox Code Playgroud) 我一直试图在家里开发时更加注重TDD和DDD.
但我不明白的一件事是你为什么要创建一个假的存储库来测试?我还没有真正研究过它,但是测试的想法肯定是为了帮助解耦你的代码(提供更多的灵活性),减少所需的代码并减少错误的数量.
那么有人可以填写我的愚蠢大脑,为什么有些人喜欢测试假存储库?我认为对真实数据库进行测试是创建假数据库的一个更好的选择,因为那时你知道它对你的真实世界数据存储有效.
首先是一段历史,我们有一个由许多javascript文件组成的引擎,这些文件本质上是模块.尽管在指定的命名空间下,这些模块返回分配给全局范围的单个类.
引擎本身用于显示电子教学内容,每个不同的电子教学课程需要稍微不同的需求,这是我们根据必要的功能将javascript文件包含到页面中的位置.(只有一个入口页面).
我一直试图权衡它是否值得改为AMD,require.js和r.js,或者如果最好继续使用我们当前的系统,其中包括页面上所需的所有内容并将其最小化为一个脚本.
去AMD的最大问题之一就是容易扩展课程似乎更难.例如,有时我们必须稍微调整原始类的行为.因此,我们通过复制原始原型在页面上添加另一个脚本include,扩展原始类,执行使用apply重写的原始函数,然后执行任何其他代码.
您是否可以在不调整原始文件的情况下扩展AMD模块?或者我错过了这一点,我们最好还是坚持我们现在正在做的事情?
我一直在我的网络应用程序中使用Ninject作为我的IOC.这很好,我认为它工作得很好,但我一直在尝试将一些接口/类注册为OnePerRequestBehaviour,但它似乎并没有真正使用这种行为.代码运行正常但在我的一个类中,它延迟从数据库加载页面信息,然后一旦加载它就不需要命中数据库.
我的问题是,在我的第一个请求中加载了延迟加载的属性,然后我请求下一页使用该类的相同实例.我知道这个的原因是因为类没有再次实例化,并且已经设置了延迟加载的属性.
这段代码在我的模块类中:
public class NinjectModule : StandardModule
{
public override void Load()
{
Bind<IUnitOfWorkDataStore>().To<HttpContextDataStore>().Using<OnePerRequestBehavior>();
Bind<CmsService>().ToSelf().Using<OnePerRequestBehavior>();
Bind<CmsRepository>().ToSelf().Using<OnePerRequestBehavior>();
}
}
Run Code Online (Sandbox Code Playgroud)
然后在继承自NinjectHttpApplication的Global.asax中,我有以下内容:
protected override IKernel CreateKernel()
{
OnePerRequestModule module = new OnePerRequestModule();
module.Init(this);
KernelOptions options = new KernelOptions();
options.InjectNonPublicMembers = true;
IKernel kernel = new StandardKernel(options, new NinjectModule());
return kernel;
}
Run Code Online (Sandbox Code Playgroud)
对CmsService的第一次调用是在global.asax以及authenticate_request中:
protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
if (HttpContext.Current.Request.Url.AbsoluteUri.Contains(".aspx") &&
!HttpContext.Current.Request.Url.AbsoluteUri.Contains(".aspx/"))
{
CmsService facCMS = HttpKernelFactory.Get<CmsService>();
ContentPage page = facCMS.GetCurrentPage();
// DO Logic based on the page being brought back …
Run Code Online (Sandbox Code Playgroud) 我们需要在已经存在的网站上添加一个wiki,但是我们只希望登录的用户能够编辑wiki,我们更愿意使用我们自己的身份验证方法.
有没有人有类似的东西或任何关于这个工作的好的维基引擎的建议?
更新:感谢大家,一般似乎是一致的是,ScrewTurn是最好的Wiki之一,但有没有人有任何经验将它集成到你自己的网站?
想象一下,您已经完成了基本布局的网站,并且您已经拥有了一个身份验证系统.
如何将引擎置于其中间,以便您的布局和菜单环绕维基并使用您自己的身份验证系统?
我发现在使用NHibernate并在一个对象上创建一对多的关系时,当许多变得非常大时,它会显着减慢.现在我在我的存储库中有方法来收集该类型的分页IList,但是我更喜欢在模型上使用这些方法,因为这通常是其他开发人员首先要收集子对象列表的地方.
例如
RecipientList.Recipients将返回列表中的每个收件人.
我想实现一种方法,在我的模型中使用优选的接口添加对我的所有关系的分页,但实际上任何不会强制键入模型的关系.例如,拥有以下界面会很不错:
public interface IPagedList<T> : IList<T>
{
int Count { get; }
IList<T> GetPagedList(int pageNo, int pageSize);
IList<T> GetAll();
}
Run Code Online (Sandbox Code Playgroud)
然后能够在代码中使用它...
IList<Recipient> recipients = RecipientList.Recipients.GetPagedList(1, 400);
Run Code Online (Sandbox Code Playgroud)
我一直试图想办法做到这一点,而不给模型任何分页意识,但我现在正撞在一堵砖墙上.
无论如何我可以用NHibernate为IList和lazyloading做的类似方式实现接口吗?我对NHibernate知之甚少知之甚少.
实现这个甚至是个好主意吗?您的想法将被认为是内部唯一的.NET开发人员,我没有人可以反复提出想法.
UPDATE
下面的帖子向我指出了NHibernate的自定义集合属性,它可以很好地工作.但是我不确定最好的解决方法是什么,我试图从PersistentGenericBag继承,以便它具有与IList相同的基本功能而没有太多工作,但是我不确定如何基于ISessionImplementor收集对象列表.我需要知道如何:
但是我不确定我是否可以做以上任何一种情况?
谢谢
c# ×5
.net ×4
asp.net ×4
nhibernate ×3
asp.net-3.5 ×1
asp.net-mvc ×1
httpcontext ×1
interface ×1
javascript ×1
js-amd ×1
ninject ×1
nunit ×1
repository ×1
tdd ×1
wiki ×1
wiki-engine ×1