我希望这个问题适合stackoverflow.如果没有,我会马上删除这个问题.
我刚刚编写了我的第一个python程序.我们的想法是你可以发出一个命令,并将它并行发送到几个服务器.
这仅用于个人教育目的.该计划有效!我真的想在python上变得更好,因此我想问下列问题:
我有一个很好的编程背景,但是我花了很长时间才开发出适合PHP的样式(PEAR编码标准,知道使用什么工具以及何时使用).
来源(一个文件,92行代码)
让我们假设我用来迭代节点列表的代码
foreach(XmlNode nodeP in node.SelectNodes("Property"))
{
propsList.Add(nodeP.Attributes["name"].Value, true);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,表达式node.SelectNodes("Property")是否在每次迭代期间为每个或一次进行评估?
我想通过学习更多关于依赖注入/ IoC和其他最佳实践方法来成为一名优秀的编程公民.为此,我有一个项目,我正在努力做出正确的选择,并以"正确"的方式设计一切,无论这意味着什么.Ninject,Moq和ASP.NET MVC帮助实现可测试性并将应用程序"推出门外".
但是,我有一个关于如何为我的应用程序所包含的对象设计实体基类的问题.我有一个简单的类库,Web应用程序是建立在它之上的.该库公开了一个IRepository接口,默认实现(应用程序使用的接口)使用了Linq-to-SQL(DataContext等没有公开给Web应用程序),只是包含获取这些实体的方法.存储库基本上看起来像这样(简化):
public interface IRepository
{
IEnumerable<T> FindAll<T>() where T : Entity
T Get<T>(int id) where T : Entity
}
Run Code Online (Sandbox Code Playgroud)
默认实现使用DataContext上的GetTable()方法来提供正确的数据.
但是,这要求基类"Entity"具有一些功能.通过创建一个与Linq-to-SQL给我的映射对象同名的部分类,很容易让我的对象继承它,但是这样做的"正确"方法是什么?
例如,上面的接口具有通过它的id获取实体的功能 - 从实体派生的所有不同类的类确实具有int类型的"id"字段(从它们各自的表的主键映射),但是我如何以一种允许我像这样实现IRepository的方式来指定它呢?
public class ConcreteRepository : IRepository
{
private SomeDataContext db = new SomeDataContext();
public IEnumerable<T> FindAll<T>() where T : Entity
{
return db.GetTable<T>().ToList();
}
public T Get(int id) where T : Entity
{
return db.GetTable<T>().Where(ent => ent.id == id).FirstOrDefault();
}
}
Run Code Online (Sandbox Code Playgroud)
我在无编译器的PC上从内存中执行此操作,因此原谅任何错误,您希望得到我的意图.
这里的诀窍当然是为了编译它,必须确定Entity承诺从它派生的每个人都有一个id字段.
我可以创建一个抽象字段,或者由Linq-to-SQL粘贴在生成的类中的id字段"隐藏"的普通字段.
但这一切都像是作弊,甚至给编译器警告.
应该"实体"真的是"IEntity"(而不是接口),我应该尝试以Linq-to-SQL将实现的方式定义id字段?这也可以很容易地指定实体实现者需要实现的其他接口.
或者"实体"应该是一个带有抽象id字段的抽象基类,它是否应该以抽象方式实现所需的接口以供其他人覆盖?
我不太清楚C#是否能够找到优雅的解决方案,所以我很乐意听到更有经验的系统设计师的一些基础经验.
谢谢!
编辑4月10日:
我看到我在这里遗漏了一些重要的东西.我的IRepository有两个具体的实现 - 一个是使用LINQ to …
我发现越来越多的我的asp.net mvc视图开始看起来像我的旧的糟糕的asp代码,我永远无法维护或保持清洁与集成的<%%>和html放在一起.下面我有一个我正在谈论的代码sammple.是否有任何最佳实践或建议的方法来避免这种情况并保持视图更易于维护和可读.
<td>
<%
bool userRequiresApproval = false;
if (!string.IsNullOrEmpty(item.loginName))
{
MembershipUserCollection membership = (MembershipUserCollection)ViewData["UnapprovedUsers"];
if (membership != null && membership[item.loginName] != null)
{
userRequiresApproval = true;
}
}
bool isLoggedInUserAdmin = false;
if (ViewData.ContainsKey("isAdmin"))
{
isLoggedInUserAdmin = (bool)ViewData["isAdmin"];
}
if (isLoggedInUserAdmin && userRequiresApproval)
{%>
<%= Html.ActionLink("View", "Details", new { id=item.Mail_ID })%>, <%= Html.ActionLink("Delete", "GotoDeleteConfirmPage", new { id = item.Mail_ID })%>, <%= Html.ActionLink("Approve", "Approve", new { id = item.Mail_ID })%>
<%}
else if (isLoggedInUserAdmin)
{%>
<%= Html.ActionLink("View", "Details", new { …Run Code Online (Sandbox Code Playgroud) 我在C#集合中使用了通用队列,每个人都说由于线程安全,最好使用System.Collection.Generic.Queue的对象.
请告知正确使用Queue对象的决定,以及它是如何安全的?
我有一个实现IPostBackEventHandler的自定义控件.一些客户端事件调用__doPostBack(controlID,eventArgs).
该控件在两个不同的用户控件中实现.在一个控件中,__doPostBack调用时在服务器端触发RaisePostBackEvent .在另一个控件中,永远不会调用RaisePostBackEvent.我检查了__EVENTTARGET参数,它确实与控件的ClientID匹配...我还可以在哪里解决这个问题?
我正在尝试使用foldl找到一种方法来执行以下功能:
count a = length (filter (\i -> i) a)
Run Code Online (Sandbox Code Playgroud)
它只计算布尔值列表中的值的数量.我亲自尝试过
count = foldl (\i ->
case i of
True -> (1+)
False -> (0+)
) 0
Run Code Online (Sandbox Code Playgroud)
哪个甚至没有编译.有什么建议?
我编写了一个应用程序,我用它作为代理来查询数据库中的数据并自动将其加载到我的分布式Web缓存中.
我这样做是通过在配置中指定sql查询和类型.实际执行查询的代码如下所示:
List<Object> result = null;
try { result = dc.ExecuteQuery(elementType, entry.Command).OfType<Object>().ToList(); }
catch (Exception ex) { HandleException(ex, WebCacheAgentLogEvent.DatabaseExecutionError); continue; }
Run Code Online (Sandbox Code Playgroud)
elementType是从配置(使用Type.GetType())中指定的类型创建的System.Type ,并且entry.Command是SQL查询.
我遇到问题的特定实体类型如下所示:
public class FooCount
{
[Column(Name = "foo_id")]
public Int32 FooId { get; set; }
[Column(Name = "count")]
public Int32 Count { get; set; }
}
Run Code Online (Sandbox Code Playgroud)
SQL查询如下所示:
select foo_id as foo_id, sum(count) as [count]
from foo_aggregates
group by foo_id
order by foo_id
Run Code Online (Sandbox Code Playgroud)
出于某种原因,在执行查询时,"Count"属性最终会填充,但不会填充"FooId"属性.我自己尝试运行查询,并返回正确的列名,列名与我在映射属性中指定的名称相匹配.救命!
我一直在尝试将对象映射封装在项目数据存储库中.也许EF将提供所需的抽象级别,但由于一系列原因我目前正在使用Linq to SQL.以下代码旨在将数据库中的用户作为ModUser对象列表返回,其中ModUser是存储库公开的POCO:
public List<ModUser> GetUsers() {
Users.Select(MapUser).ToList();
}
public Expression<Func<User, ModUser>> MapUser {
get {
return u => new ModUser() {
UserId = u.User_Id,
UserResources = u.Resources(MapResource)
}
}
}
public Expression<Func<Resource, ModResource>> MapResource { ...
Run Code Online (Sandbox Code Playgroud)
代码将失败,因为我无法调用MapResource表达式,因为我试图从另一个表达式中调用它.我设法通过用'=> new ModResource()替换'MapResource'来解决这个问题,然后使用ExpressionVisitor找到这个占位符节点并用MapResource表达式替换它.
当我尝试使用涉及单个属性的表达式(即UserResource = MapResource)分配ModUser的属性时,我也遇到了类似的问题.我已经设法通过使用Expression类上的方法手动组合所需的表达式来解决第二个问题.
我意识到我可以将上面的代码更改为
UserResources = u.Resources(r => MapResource.Compile().Invoke(r));
Run Code Online (Sandbox Code Playgroud)
但是生成的最终SQL查询需要获取r的所有属性,而不仅仅是MapResouce所需的属性,因为我们现在处理的是一个函数.此外,如果MapResouce需要访问r上的其他表,则不可能,因为它被用作函数而不是表达式.我可以将DeferredLoadingEnabled设置为true,但这会产生大量单个查询,而不是修改主查询以与所需的任何表连接.
有谁知道在将来的.NET版本中这些操作是否会变得更容易,或者我是否会以错误的方式解决这个问题?我非常喜欢Linq和Expression功能,我希望我可以使用更易读的代码来使用它们.
更新
以为我可能会添加一些示例,说明我如何使表达式更具组合性.他们并不简洁,但他们完成了工作.
public Expression<Func<User, ModUser>> MapUser {
get {
Expression<Func<User, ModUser>> mapUser = u => new ModUser() {
UserId = u.User_Id,
UserResources = u.Resources(r => new ModResource())
};
return …Run Code Online (Sandbox Code Playgroud) 如果我这样做:
def foo():
a = SomeObject()
Run Code Online (Sandbox Code Playgroud)
离开foo后,'a'是否被立即销毁?还是等待一些GC发生?
c# ×4
linq-to-sql ×3
.net ×2
asp.net ×2
python ×2
asp.net-mvc ×1
collections ×1
count ×1
datacontext ×1
enumeration ×1
executequery ×1
haskell ×1
lambda ×1
oop ×1
postback ×1
views ×1