我刚刚开始研究.NET 3.5,如果之前已经提出这类问题,请原谅我.我正在努力使用扩展方法,因为我刚刚下载了suteki商店的MVC电子商务产品.在这个项目中,有一个非常标准的Repository模式,它扩展了IRepository.
为了扩展此接口公开的基本功能,使用了扩展方法,即:
public static class CategoryRepositoryExtensions
{
public static Category GetRootCategory(this IRepository<Category> categoryRepository)
{
return categoryRepository.GetById(1);
}
}
Run Code Online (Sandbox Code Playgroud)
现在这一切都很好,但就我而言,Interfaces充当了实现它们的对象的契约.
存储库已经接口的事实表明尝试采用数据层不可知的方法.也就是说,如果我要创建自己的数据层,我会对我必须创建的扩展方法感到困惑,以确保我已经完成了对实现我的存储库类的类的合同要求.
似乎创建IRepository然后扩展的旧方法允许更好地查看所需内容,例如
ICategoryRepoitory : IRepository<Category>
{
Category GetRootCategory();
}
Run Code Online (Sandbox Code Playgroud)
所以我想我的问题是,对于其他人来说,这种扩展方法的使用是否是错误的?如果没有,为什么?我不应该抱怨这个吗?
编辑:
上面的例子似乎是一个很好的例子,说明为什么扩展方法可以非常有用.
我想我的问题是,如果数据访问特定的实现被卡在数据访问机制程序集中的扩展方法中.
这样,如果我将其换成另一种机制,我将不得不在该程序集中创建一个类似的扩展方法.
我需要一些一般建议来重新制作VPC和路由.我的基本情况是我在ELB后面的ASG中有一些应用服务器.这些应用服务器向ip白名单的提供商进行SOAP调用,因此我需要从固定IP发出传出请求.
我试图做的是创建一个私有(没有互联网网关)VPC并在这里添加我的应用实例.然后我在这里创建了一个公共VPC(互联网网关)并放置了我的ELB和NAT实例.
如果正确设置了路由/安全性,这种设置是否有意义?
在向现有模型添加新关联时,我对 Ecto 感到相当困惑。假设我有一些用户可以喜欢帖子的讨论板,我有以下模型:
schema "discussion_items" do
many_to_many :likes, XXX.Tag, join_through: "discussion_items_likes"
timestamps()
end
schema "likes" do
belongs_to :user, XXX.User
timestamps()
end
Run Code Online (Sandbox Code Playgroud)
现在假设我有一个现有的DiscussionItem,我想为此添加一个类似的关联,这是我正在尝试的(简化):
user = Repo.one(User)
discussion_item = Repo.one(from d in DiscussionItem, preload [:likes])
like_changeset = Like.changeset(%Like{})
|> Ecto.Changeset.put_assoc(:user, user)
changeset = Ecto.Changeset.change(discussion_item)
|> Ecto.Changeset.put_assoc(:likes, [like_changeset])
Ecto.update!(changeset)
Run Code Online (Sandbox Code Playgroud)
我发现这将在第一次正确创建 Like 和关联,但之后抱怨我需要一些 id 形式的附加信息:
您正在尝试更改关系:喜欢 XXX.DiscussionItem,但缺少数据
如果您尝试更新现有条目,请确保在数据旁边包含条目主键 (ID)。
如果你有很多孩子的关系,那么更新时至少要给同样的N个孩子。默认情况下,不可能孤立嵌入或关联的记录,尝试这样做会导致此错误消息。
所以这是让我困惑的事情(有一些):
User并Dicussion_item添加一个赞吗?在我最近完成的一个项目中,我们使用了一个体系结构,因为它的Web /服务层的顶层交互使用了XXXManager类.
例如,有一个按计划运行的Windows服务,它将来自多个不同数据源的数据导入我们的系统.在此服务中,调用了几个"Manager"类,即CPImportScheduleManager,CPImportProcessManager等.
现在,这些Manager类不仅仅是将方法传递到链上以便在Web /服务层中使用.例如,我的UserManager.Register()方法不仅通过较低级别的程序集保留用户,而且还向用户发送WAP推送并确定使用的移动手机等.
有人向我建议,这种类型的架构我是尝试使OOP适合程序模型的常用手段.我可以在这里看到他们的观点,但我想知道的是,使用这个顶级类的任何Web /服务层都可以简单地调用相同的常用方法而无需重写代码.因此,如果我想编写一个Web服务,在某些时候注册用户,我可以再次调用UserManager.Register()方法,而不必再次重写所有逻辑.
我从来都不是解释自己的最佳人选,但如果我的谣言有意义,请随时提出建议.
干杯,克里斯.
所以Jeff Atwood正确地抱怨Visual Studio没有执行后台编译,请参阅:http://www.codinghorror.com/blog/2007/05/c-and-the-compilation-tax.html
来自大多数来源的解决方案似乎是Reshaper,它会在您编写时逐步执行后台编译.这导致了他们伟大的实时重新分解技巧和错误检测.
但我不明白的是R#不断编译我的代码,为什么通过VS执行编译需要这么长时间(即Ctrl + Shift + B或类似代码).我的意思是,如果R#已经编译了我的代码那么为什么我需要重新编译?
我的假设当然是R#不会覆盖我的bin目录中的程序集,而是将编译结果保存在内存中.在这种情况下,编译成功时是否可以告诉R#简单地覆盖我的程序集?
我们使用开源图像处理工具ImageMagick来获取各种文件的缩略图.我们认为所有这些都运行得非常顺利,直到我们意识到某些浏览器(即Internet Explorer 8和Chrome)无法显示JPEG文件.
我只能假设ImageMagick转换的输出不是Web安全的JPEG.为什么会这样,它可以修复吗?
顺便说一下,我们正在使用命令行工具convert,我们正在使用这些参数:
convert -thumbnail 150x fileToThumb outputPath
Run Code Online (Sandbox Code Playgroud)
编辑:
Image: 50afd2b1-e42c-4e90-9244-9c5a00c1933d.jpg
Format: JPEG (Joint Photographic Experts Group JFIF format)
Class: DirectClass
Geometry: 150x212+0+0
Resolution: 72x72
Print size: 2.08333x2.94444
Units: PixelsPerInch
Type: ColorSeparation
Endianess: Undefined
Colorspace: CMYK
Depth: 8-bit
Channel depth:
cyan: 8-bit
magenta: 8-bit
yellow: 8-bit
black: 8-bit
Channel statistics:
cyan:
min: 0 (0)
max: 255 (1)
mean: 28.492 (0.111734)
standard deviation: 61.879 (0.242663)
kurtosis: 5.32422
skewness: 2.47138
magenta:
min: 0 (0)
max: 255 …Run Code Online (Sandbox Code Playgroud) 尝试通过Web服务下载文档时,我们不断收到OutOfMemory异常.我们将文档字节数组数据存储为序列化消息对象的一部分,原始文档的大小均为~500kb.消息对象图中唯一的另一个东西是两个用于关联的字符串属性.
我们已经尝试检索压缩和未压缩的文档具有相同的问题.现在我相信在尝试反序列化消息而不是在下载流时引发了异常.
我知道这是一个模糊的问题,但是你们中的任何人都知道是什么原因造成的吗?此处传输的数据量似乎非常小,并且在传输时设备上几乎没有其他事情发生.
architecture ×2
.net-3.5 ×1
amazon-elb ×1
amazon-vpc ×1
c# ×1
compilation ×1
ecto ×1
elixir ×1
imagemagick ×1
nat ×1
resharper ×1
web-services ×1
windows-ce ×1