在PHP中编程时,我总是尝试创建与数据库中的表对应的有意义的"模型"(类).我经常遇到以下问题:
假设我已经创建了一个包含两个表的数据库:authors并且blogs在我的应用程序中都有相应的模型.
假设我想打印所有博客以及有关作者的信息,我必须做这样的事情:
<?php
foreach ($app->getBlogs() as $blog) {
echo "<h1>" . $blog->title . "</h1>";
echo "Written by" . $blog->getAuthor()->name . "</p>";
// ... et cetera
}
?>
Run Code Online (Sandbox Code Playgroud)
问题是,应用程序现在将触发1个SQL查询以获取所有博客项目和[博客项目数]查询以获取每个作者的信息.使用简单的SQL我可以使用简单的查询检索此信息:
SELECT * FROM blogs
JOIN authors ON authors.id = blogs.author
Run Code Online (Sandbox Code Playgroud)
处理此类问题的最佳方法是:开发面向对象的应用程序而不执行太多无用的SQL查询.
当您将项目添加到System.Web.Caching.Cache具有绝对到期日期时,如下例所示,Asp.Net如何表现?可以:
只需将项目标记为已过期,然后执行CacheItemRemovedCallback下一次访问尝试?
从缓存中删除该项并CacheItemRemovedCallback立即执行?
HttpRuntime.Cache.Insert(key,
new object(),
null,
DateTime.Now.AddSeconds(seconds),
Cache.NoSlidingExpiration,
CacheItemPriority.NotRemovable,
OnCacheRemove);
Run Code Online (Sandbox Code Playgroud)MSDN似乎表明它立即发生.例如,"ASP.NET缓存概述"的"过期"部分说"ASP.NET在过期时会自动从缓存中删除项目".类似地,主题"如何:从缓存中删除项时通知应用程序"主题中的示例说"如果在调用GetReport[示例中的方法] 之间超过15秒,ASP.NET将从中删除报告缓存".
尽管如此,这些都不是明确的.他们没有说"回调是立即执行的",我可以设想他们的作者可能认为上面的选项1算作"删除"一个项目.所以我做了一个快速而肮脏的测试,而且,它似乎立即执行 - 即使没有人访问我的网站,我也会定期进行第六十二次回调.
尽管如此,我的测试很快而且很脏,并且在我的回答评论中是否有办法在.Net Web应用程序中每天运行一个进程而无需编写Windows服务或SQL服务器作业,有人建议使用Asp.Net实际上是推迟删除和执行回调,直到某些东西再次尝试访问缓存.
任何人都可以权威地解决这个问题,还是仅仅考虑实施细节?
我需要使用C#应用程序的内置版本并更改其中一个引用dll.最好的方法是什么,我在参考dll上关闭了特定版本,但是当我测试用新版本替换dll时,我得到"无法加载文件或程序集XXXXX,版本= XXXXX.是有一种方法可以阻止加载器关心dll的版本,这样dll只会尝试加载?
这个问题让我想到了Java和.NET等高级开发框架中的线程局部存储.
Java有一个ThreadLocal<T>类(也许还有其他构造),而.NET有数据槽,很快就有ThreadLocal<T>了它自己的类.(它也有ThreadStaticAttribute,但我对成员数据的线程局部存储特别感兴趣.)大多数其他现代开发环境为语言或框架级别提供了一种或多种机制.
线程局部存储解决了什么问题,或者线程局部存储提供了什么优势,而不是创建单独的对象实例以包含线程本地数据的标准面向对象的习惯用法?换句话说,这是怎么回事:
// Thread local storage approach - start 200 threads using the same object
// Each thread creates a copy of any thread-local data
ThreadLocalInstance instance = new ThreadLocalInstance();
for(int i=0; i < 200; i++) {
ThreadStart threadStart = new ThreadStart(instance.DoSomething);
new Thread(threadStart).Start();
}
Run Code Online (Sandbox Code Playgroud)
优于此?
// Normal oo approach, create 200 objects, start a new thread on each
for(int i=0; i < 200; i++) {
StandardInstance standardInstance …Run Code Online (Sandbox Code Playgroud) 我正在使用VS2010并创建了一个简单的asp.Web表单应用程序,使用Development Server对其进行测试.
我尝试在会话中存储用户数据 - 从sql server查询 - 因为我不想在每个请求中访问数据库.我正在使用'Application_AuthenticateRequest'和'Session_Start'方法.
第一轮:调用AuthenticateRequest.运行以下代码:
public static void Initialize(string login_name, bool force_refresh)
{
HttpSessionState Session = HttpContext.Current.Session;
object o = Session == null ? null : Session["EMPLOYEE_DATA"];
if (force_refresh || o == null || o.GetType() != typeof(Employee) || (o as Employee).login_name!= login_name)
{
_current = UIManager.GetEmployee(login_name);
if (Session != null)
{
Session["EMPLOYEE_DATA"] = _current;
}
}
else
{
_current = (Employee)o;
}
}
Run Code Online (Sandbox Code Playgroud)
_current变量是通过静态属性发布的私有静态字段.在第一轮中,Session是null,我认为没关系,因为Session_Start尚未调用.Session_Start看起来像这样:
protected void Session_Start(object sender, EventArgs e)
{
Session["EMPLOYEE_DATA"] = EmployeeFactory.Current;
}
Run Code Online (Sandbox Code Playgroud)
在下一轮中,当然没有调用Session_Start,但在AuthenticateRequest中我无法访问会话.HttpContext.Current.Session为null,this.Session引用抛出HttpException,表示"会话状态在此上下文中不可用". …
我使用NMock2,并且我已经起草了以下NMock类来表示一些常见的模拟框架概念:
Expect:这指定了一个模拟方法应返回的内容,并说必须进行调用或测试失败(当伴随调用时VerifyAllExpectationsHaveBeenMet()).
Stub:this指定模拟方法应返回的内容,但不能导致测试失败.
那我该怎么做呢?
因此,引用来自".NET中的依赖注入".考虑到这一点,下面的类是错误设计的吗?
class FallingPiece { //depicts the current falling piece in a tetris game
private readonly IPieceGenerator pieceGenerator;
private IPiece currentPiece;
public FallingPiece(IPieceGenerator pieceGenerator) {
this.pieceGenerator = pieceGenerator;
this.currentPiece = pieceGenerator.Generate(); //I'm performing work in the constructor with a dependency!
}
...
}
Run Code Online (Sandbox Code Playgroud)
所以这个FallingPiece班级有责任在俄罗斯方块游戏中控制当前掉落的棋子.当这件作品撞到底部或其他地方时,会发出一个事件信号,然后通过工厂生成另一个从上面再次开始下落的新件.
我看到的唯一替代方法是使用Initialize()方法生成该块,但IMO有点违背了让构造函数将对象置于有效状态的想法.
如何解码ASP.NET EventValidation和ViewState?
我得到了一个编程任务,我要做的一件事就是实现方法,它是一个包装器方法,它依赖于另一种方法来从最低到最高的坐标排序.我不确定实现包装器方法的确切含义.
static void sortCoordsByZ(double[][] coords) {
//implement the wrapper method for the recursive sort method. all work is done the recursive sort method
}
static void recursiveSort(double[][] coords, int lo, int hi) {
//recursive sort method
}
Run Code Online (Sandbox Code Playgroud) 我试图找出差异服务帐户类型之间的区别.我摔倒了这个问题.
答案是因为它具有对本地资源的强大访问权限,并且应尽可能使用网络服务.
但我仍然无法理解,如果它具有强大的本地资源访问权限,攻击者如何访问该帐户?有什么方法可以破坏帐户?我明白这一切都与安全有关,但我不知道如何.这可能是黑暗黑客的世界,但是,任何人都可以简单地解释为什么网络服务帐户比本地帐户更好?
提前致谢.