我只是花了一些时间阅读这些术语(我没有那么多使用它们,因为我们没有任何MVC应用程序,我通常只说"模型"),但我觉得这些意味着不同的东西取决于上下文:
实体
这很简单,它是数据库中的一行:
2)关于数据库,实体是可以存储数据的单个人,地点或事物.
模型
我经常读到,这基本上是实体的组合以表示一整套数据,假设客户的地址列表模型将实体客户,地址和可能的个体组合在一起.
视图模型
MVVM或MVC模式中的一个术语,它是一个模型,它完全代表您可以在视图上看到的数据.viewmodel位于应用程序层,具有验证属性,即ASP.NET MVC Model vs ViewModel
从我的视线来看,这些术语似乎有点多余:Viewmodel显然已经使用了它,否则视图必须做所有努力才能显示正确的东西.正如我们从EF中所知,实体只是表示,但如果你将这两者结合起来,那么模型的使用在哪里?
必须在ViewModel上完成验证,安全等操作.当你有数百个小表在实体和viewmodel之间放置另一个抽象时,你会使用该模型吗?或者在MVC和MVVM实体和模型方面通常是一样的吗?
像往常一样感谢周末愉快
马蒂亚斯
我想要得到的想法,这将是发布对象的只读目录作为一个公共方法的最佳方式?从Eric Lippert的博客来看,阵列有点糟糕,因为有人可以轻松添加新条目.因此,每次调用该方法时都必须传递一个新数组.他建议,要通过IEnumerable<T>,因为这是每个定义只读(没有添加,删除方法),我练习了很长一段时间.但是在我们的新项目中,人们甚至开始创建这些的数组IEnumerables,因为他们不知道后面的DataSource,所以他们得到:处理警告可能多次枚举IEnumerable
我对技术方法感兴趣,如何解决这个难题.到目前为止,我提出的唯一解决方案是使用a IReadOnlyCollection,但这比使用更明确IEnumerable.
发布此类列表的最佳做法是什么,这些列表不应更改,但应声明为内存列表?
我们现在正在使用Angular 4建立一个SPA,在Azure上使用Docker托管它.通常,如果我们使用Angular-CLI构建命令,则使用Environment-Configs在Angular中设置环境(Prod,Development,Testing).这很棒,但Docker的工作流程有点不同:
这意味着我们有一个计时问题,因为在编译时,我们不能说,应用程序将在哪个环境中运行.对于服务器(.net核心),这没有问题,因为我们可以使用ASPNETCORE_ENVIRONMENT变量,但我们没有找到使App知道环境类型的解决方案.我几乎可以肯定我们并不是唯一一个遇到这个问题的人,但到目前为止我找不到合适的解决方案.是否有一些我们不知道的可能性?
我知道,这个问题被多次询问,但我做了一些研究,但仍然没有得到它,可能你可以帮助我:正如很多次说的那样,UML几乎是一样的.此外,实现和想法或多或少相同:您可以定义一个Interface,而不是子类型,它封装了一些逻辑,让它传递给一个抽象.所以,即使是微软博客的人
简单的答案是"它们相似但不同".实现类似但意图不同.举一个类比,城市公交车和校车都是类似的车辆,但它们用于不同的目的.一种用于在城市的各个部分之间运送人员作为通勤服务.另一个用于将孩子送到学校.
"如果它看起来像一只鸭子,看起来像一只鸭子,但它打算成为一只天鹅,它可以是其中之一",这就是我在这里读到的.
因为我还没有得到它,所以我深入挖掘:
此线程也不添加任何新内容,除了:
它们在表面上看起来也一样.我看到的主要区别在于,在Bridge模式中,抽象是对象的PART,但在Strategy模式中,抽象是由对象执行的.
但是,如果我们阅读战略的定义:
定义一系列算法,封装每个算法,并使它们可互换.策略允许算法独立于使用它的客户端.
没有任何定义,如何应用该战略.它也可以很容易地成为摘要上的接口,与LINQ-Orderby等常见的策略实现完全相同.
关于这个主题的另一个兴趣是:
http://game-engineering.blogspot.ch/2008/07/bridge-pattern-vs-strategy-pattern.html
这个话题的主要部分:
当你想要改变行为时,你会说"策略",而你不是通过编写不同的对象而是通过引入类层次来实现.当您希望改变界面和实现时,您会说"Bridge".在这两种情况下,您都可以为不断变化的实施提供灵活性; 在Bridge中,您还希望界面能够改变.
这可能是主要区别吗?由于执行器和抽象是如此松散耦合,我可以改变执行器的接口,抽象不必关心?这听起来很合理,但是由于它们是有联系的,所以也不会有抽象改变吗?这不会破坏信息隐藏和DRY等所有其他原则吗?
我还看了很多例子,我不会为了这个地方而添加这些例子,我找不到这些模式的例子,我无法改变以适应另一个.无论是通过Interface-Property还是参数.
我在这里错过了吗?可能任何人都有一个真实生活的例子"我想使用策略,但Bridge确实更合适",反之亦然,例如?
编辑:为什么我为这个主题辩护(再次)?首先,所提到的线程的接受答案如下
据我了解,当你抽象出可以从外部源提供的行为时(例如,config可以指定加载一些插件程序集),你正在使用策略模式,并且当你使用时你正在使用桥接模式相同的结构使你的代码更整洁.实际的代码看起来非常相似 - 你只是因为略有不同的原因而应用这些模式.
我在之前的解释中已经提到,外部源的抽象行为正是Strategy-和Bridge-Pattern的定义.
也
当你使用相同的结构使你的代码更整洁时,你正在使用桥接模式.
此外,策略模式使代码更整洁,因为它将整个构建块抽象出来,从而使代码收紧了很多.
我想任何阅读整个主题的人都会看到,这个主题的内容比这2个句子更多.
我正在尝试在ASP.Net Core 2中构建自定义AuthenticationHandler。在跟进ASP.NET Core 2.0身份验证中间件以及为什么Asp.Net Core Authentication Scheme是强制性主题之后,我创建了特定的类。注册发生如下:
services.AddAuthentication(
options =>
{
options.DefaultScheme = Constants.NoOpSchema;
options.DefaultAuthenticateScheme = Constants.NoOpSchema;
options.DefaultChallengeScheme = Constants.NoOpSchema;
options.DefaultSignInScheme = Constants.NoOpSchema;
options.DefaultSignOutScheme = Constants.NoOpSchema;
options.DefaultForbidScheme = Constants.NoOpSchema;
}
).AddScheme<CustomAuthOptions, CustomAuthHandler>(Constants.NoOpSchema, "Custom Auth", o => { });
Run Code Online (Sandbox Code Playgroud)
如果特定的控制器明确设置了Scheme,则一切正常。
[Authorize(AuthenticationSchemes= Constants.NoOpSchema)]
[Route("api/[controller]")]
public class IndividualsController : Controller
Run Code Online (Sandbox Code Playgroud)
但是我不想设置模式,因为它应该动态添加。删除计划属性后,如下所示:
[Authorize]
[Route("api/[controller]")]
public class IndividualsController : Controller
Run Code Online (Sandbox Code Playgroud)
它不再起作用了。
我本来希望,设置DefaultScheme属性可以完成这项工作。有趣的是,我没有找到关于此主题的任何具体讨论。我在这里做错什么了吗?还是我的预期结果不对?
编辑:感谢您的问题,它对我有很大帮助。好像在没有CustomAuthHandler时,我仅使用的身份验证中间件正在映射DefaultScheme。因此,我必须始终添加AuthenticationMiddleware。
Edit2:不幸的是,它仍然不起作用。为了进一步说明我的问题:我将像往常一样添加中间件:
app.UseAuthentication();
app.UseMvc();
Run Code Online (Sandbox Code Playgroud)
现在,进入我的处理程序,它看起来像这样:
public class NoOpAuthHandler : AuthenticationHandler<NoOpAuthOptions>
{
public const string NoOpSchema = "NoOp";
public …Run Code Online (Sandbox Code Playgroud) 我正在尝试在解决方案中创建一个只有1个Project的小型Excel-Addin.我在http://social.msdn.microsoft.com/Forums/vstudio/en-US/0c144a87-917a-4eb1-8716-da61f7efdafc/office-developer-tools-for-visual-studio-2013-march下载了工具-2014-update-now-available?forum = lightswitch,可以创建一个加载项.
我甚至可以调试它,但是一旦我重建解决方案,我就会得到以下2个错误:
错误1"SignFile"任务不支持"TargetFrameworkVersion"参数.验证该任务上是否存在该参数,它是一个可设置的公共实例属性.
错误2无法使用其输入参数初始化"SignFile"任务.
有趣的是,在另一台机器上,重建工作完美无缺,而其他开发人员知道他没有做任何特别的事情.
我检查了一个回合这个SignFile任务,但是:http://msdn.microsoft.com/en-us/library/ms164304.aspx,但是当我卸载项目并检查文件时,那里没有这样的条目.
在有问题的机器上,我创建了一个新的AddIn-Solution,并在完全相同的问题上运行一个空的解决方案.
PS:我无法取消选中签名选项卡中的"签署ClickOnce显示"复选框.从我发现的证书已过期,但如果我创建一个新的解决方案,这怎么可能?
先谢谢马蒂亚斯
这只是一个理论问题,但我无法得到一个好的答案:
如果我传递参数ref,则传递对象本身而不是副本.
这让我感到困惑:据我所知,每个方法都有自己的堆栈帧 - 内存,它们无法离开.那么这是否意味着ref-Object被打包在堆上并且有一个对这个参数的引用,或者该方法是否进入调用方法的堆栈并在那里工作?
如果我的问题令人困惑,我很抱歉,我基本上想知道如何保存ref类型以及它有什么影响.
伊迪丝:我想我并没有说清楚.我理解价值和拒绝类型的概念.为了使它更容易,我尝试用值类型解释它,让我们说Int:
过程1通过传递Int ByVal调用Prodecure 2.这个int在Prodecure 2的堆栈上有自己的内存,这意味着,在P2中改变这个值不会改变P1中的值,因为这两个值在每个堆栈中保存一次.
现在与byref相同:Prodecure 2不会保存Int的副本,但可以直接访问此值.(在我的Oppinion中)有两种可能性来完成这项工作:
这是否更清楚我的意思?
我们都知道堆栈和堆的想法,但我最近读到了第三个保存数据的选项:寄存器.
我很难找到关于这种类型的好文章,我发现的是:http://www.dotnetperls.com/method-parameter,以及C的很多内容,例如:http://igoro.com/存档/易失性-关键字在-C-存储器模型解释的/
到目前为止我唯一的实际信息:每个CPU都有自己的寄存器,可用于保存数据,以尽可能快的方式访问,例如在for循环中.
据我所见,这种注册是由CLR完成的.然后我想起了这个volatile-keyword,如果我们看一下MSDN:
volatile关键字表示某个字段可能被同时执行的多个线程修改.声明为volatile的字段不受编译器优化的约束,这些优化假定由单个线程进行访问.这可确保始终在字段中显示最新值.
那么Volatile也是如此吗?它告诉CLR不要使用CPU寄存器而是堆栈/堆,它可以被所有CPU /线程访问?
我很抱歉这个令人困惑的问题,但关于这个话题的信息确实很少.
我们目前的设置是多个系统使用一个巨大的数据库。在我们最新的系统中,我们使用 Entity Framework Core 和代码优先的方法。不幸的是,其他系统对数据库所做的一些更改不会在代码优先系统中更新。由于我们没有完整的集成测试覆盖范围,因此这些更改有时不会被通知,直到有人偶然使用更改的实体。
我们不能快速地改变设置;因此,如果数据库和模型同步,我们希望进行一些自动健全性检查。在寻找这样的解决方案时,我发现了这段很好的代码:Does an equal to Database.CompatibleWithModel(bool) Exist in EF Core
但明确指出不应使用此代码(而且无论如何它都不再起作用)。我在这里从 Brice 那里找到了更多想法:验证 EF Core ModelSnapshot、迁移和实际数据库架构彼此一致。但这些方法大多是手动方法,不太容易直接从代码中使用。
是否已经有一个解决方案,允许直接从 C# 检查映射和实际数据库之间的同步?检查 Entity Framework Core 接口,我认为我们将拥有所有需要的信息,但以通用方式对此检查进行编程似乎是一项艰巨的任务?
我想我缺乏理解,到底发生了什么:用户可以输入一个程序集的路径和一个对象类型,然后我尝试创建它的一个实例。
我的做法:
Assembly a = Assembly.LoadFile(txtAssemblyPath.Text);
Type myType = a.GetTypes().ToList().FirstOrDefault(f => f.Name == txtObjectName.Text);
var obj = Activator.CreateInstance<myType>();
var obj2 =(myType) Activator.CreateInstance(myType);
Run Code Online (Sandbox Code Playgroud)
问题在于对象本身的创建。看起来 myType 作为类型并没有受到威胁。在此示例中:从类型创建泛型变量 - 如何?或者使用带有属性 { } 而不是参数 ( ) 的 Activator.CreateInstance() ?
他们只是得到一个对象,所以我想这不是同一个案例。我完全不明白:CreateInstance(Type) 有效,但带有 Type 的 CreateInstance 无效,但 T 和 Type 应该相同:System.Type。
预先感谢您的澄清。
马蒂亚斯
c# ×9
angular ×1
arrays ×1
asp.net-core ×1
asp.net-mvc ×1
bridge ×1
clr ×1
docker ×1
linq ×1
memory-model ×1
mvvm ×1
oop ×1