Questions tagged «c#»

C#是Microsoft与.NET平台并行创建的一种多范式,托管的,垃圾回收的面向对象编程语言。

2
我们应该将网站编译为单个dll还是每页dll?
我们正在开发一个新项目,该项目将部署在大量客户站点上。该项目包含一个基于Web的GUI,作为其“访问点”之一。Web界面的速度是此项目的首要任务,仅次于安全性。 过去,我们总是在Visual Studio中创建“网站”,发布后,系统中每个页面都会产生一个dll和一个aspx文件。但是,我知道您实际上可以创建一个“ Web应用程序”,并将其编译成单个dll。 对我而言(基于无真实数据,仅凭直觉),将站点编译为单个dll听起来对安全性和速度(如果仅是很小的话)会更好。 在选择适合自己的方法时,我们应该考虑哪些方面的考虑?是否应该注意任何明显的陷阱?

5
修改通过引用传递的对象是不好的做法吗?
过去,我通常会在创建/更新对象的主要方法中对对象进行大部分操作,但是最近发现自己采用了另一种方法,我很好奇它是否是不好的做法。 这是一个例子。假设我有一个接受User实体的存储库,但是在插入该实体之前,我们调用一些方法以确保其所有字段都设置为所需的值。现在,不是调用方法并从Insert方法中设置字段值,而是调用一系列准备方法,这些方法在对象插入之前对其进行成形。 旧方法: public void InsertUser(User user) { user.Username = GenerateUsername(user); user.Password = GeneratePassword(user); context.Users.Add(user); } 新方法: public void InsertUser(User user) { SetUsername(user); SetPassword(user); context.Users.Add(user); } private void SetUsername(User user) { var username = "random business logic"; user.Username = username; } private void SetPassword(User user) { var password = "more …

6
不变类型的缺点是什么?
当不希望更改类的实例时,我看到自己使用越来越多的不可变类型。它需要做更多的工作(请参见下面的示例),但是可以更轻松地在多线程环境中使用这些类型。 同时,即使可变性不会使任何人受益,我也很少在其他应用程序中看到不可变类型。 问题:为什么在其他应用程序中很少使用不可变类型? 这是因为编写不可变类型的代码时间更长, 还是我错过了某些东西,使用不可变类型时有一些重要的缺点? 现实生活中的例子 假设您是Weather从RESTful API 获得的: public Weather FindWeather(string city) { // TODO: Load the JSON response from the RESTful API and translate it into an instance // of the Weather class. } 我们通常会看到的是(删除新行和注释以缩短代码): public sealed class Weather { public City CorrespondingCity { get; set; } public …
12 c#  immutability 

1
在大型对象层次结构中使用访问者模式
语境 我一直在使用对象层次结构(一个表达式树)使用“伪”访问者模式(伪,因为它不使用双调度): public interface MyInterface { void Accept(SomeClass operationClass); } public class MyImpl : MyInterface { public void Accept(SomeClass operationClass) { operationClass.DoSomething(); operationClass.DoSomethingElse(); // ... and so on ... } } 由于MyInterface的实现数量很多(约50个或更多),而且我不需要添加额外的操作,因此该设计非常舒适。 每个实现都是唯一的(它是一个不同的表达式或运算符),而某些实现是组合的(即,将包含其他运算符/叶节点的运算符节点)。 遍历当前是通过在树的根节点上调用Accept操作来执行的,后者依次在其每个子节点上调用Accept,依次类推...依次类推... 但是现在是时候需要添加一个新操作了,例如漂亮的打印: public class MyImpl : MyInterface { // Property does not come from MyInterface public string …

4
数据访问层中的业务对象
因此,我一直在通过TDD创建数据访问层,并且有些担心。我宁愿不走错误的道路,所以我想让你们看看我的想法是否符合干净的体系结构。 我的数据访问层(简称DAL)中的方法非常简单。它们与数据库中的存储过程一致(没有其他方法可以使数据库保持干净),并且它们包含与存储过程相同的参数。然后,他们仅连接到数据库,并返回查询结果。这是一个例子: public int DeleteRecord(int recordId) { recordId.RequireThat("recordId").NotZeroOrLess(); List<SqlParameter> parameters = new List<SqlParameter>(); parameters.Add(new SqlParameter { ParameterName = "@RecordId", SqlDbType = SqlDbType.Int, Direction = ParameterDirection.Input, Value = recordId}); return this.ExecuteNonQuery("DeleteRecord", parameters.ToArray()); } 这对于这种类型的方法非常有效,因为我对结果集没有做任何有意义的事情。我只想确保命令有效,所以我将返回非查询的结果,该查询只是受影响的行,并且我可以使用该数字来验证逻辑。 但是,在另一种DAL方法中,我想加载一条记录。我的加载过程将selects针对一堆表执行并返回a DataSet,但是我正在努力解决DAL是否应该使用来在方法内创建Business Objects的问题DataSet,或者我的Business Objects本身是否应该具有Load()获取该方法的方法的问题。DataSet然后从DAL开始,然后基本完成 通过DAL进行操作会导致业务对象中的逻辑更少(即使这只是选择逻辑,仍然是逻辑),但是会使DAL有点拥挤,使人感觉它确实在做它不应该做的事情。做。 你们有什么感想?


8
是否可以将代码完全记录在业务逻辑之外?
借助AOP,我可以从业务逻辑中删除日志记录代码。但是我认为它只能用于记录简单的事物(即记录方法的进入/退出和参数值)。 但是,如果我需要在业务逻辑中记录一些内容,该怎么办?例如 public void SomeDomainMethod(string id) { //Get user by Id User user = Users.Get(id); if (user == null) { Log.Warn("user is not existed"); //<----------------- Log A throw new InvalidOperationException("user is not existed"); } //Step 1 while(true) { //do something } Log.Info("Step 1 is completed"); //<----------------- Log B //Step 2 …

4
用OO语言编写逻辑过程软件的最简洁方法
我是一名电气工程师,我不知道自己在做什么。请保存我的代码的未来维护者。 最近,我一直在研究一些较小的程序(在C#中),其功能在逻辑上是“过程的”。例如,其中之一是一个程序,该程序从不同的数据库收集信息,使用该信息生成某种摘要页面,将其打印出来,然后退出。 所有这些所需的逻辑约为2000行。我当然不想像以前的开发人员所做的那样将所有内容全部填充到一起main(),然后用来“清理” #region(颤抖)。 这是我已经尝试过但不太满意的一些事情: 为每个粗略的功能(例如DatabaseInfoGetter,SummaryPageGenerator和PrintUtility)创建静态实用程序。使主要功能看起来像: int main() { var thisThing = DatabaseInfoGetter.GetThis(); var thatThing = DatabaseInfoGetter.GetThat(); var summary = SummaryPageGenerator.GeneratePage(thisThing, thatThing); PrintUtility.Print(summary); } 对于一个程序,我什至使用了接口 int main() { /* pardon the psuedocode */ List<Function> toDoList = new List<Function>(); toDoList.Add(new DatabaseInfoGetter(serverUrl)); toDoList.Add(new SummaryPageGenerator()); toDoList.Add(new PrintUtility()); foreach (Function f in toDoList) f.Do(); …

5
实体框架的域驱动设计的陷阱
我研究的许多DDD教程都涵盖了理论。它们都有基本的代码示例(Pluralsight和类似代码)。 在网络上,也有人尝试创建涵盖EF的DDD的教程。如果您只是简短地学习它们-您很快就会发现它们彼此之间有很大的不同。有些人建议保持应用程序最小化,并避免在EF之上引入其他层(例如,存储库),其他人则决定生成额外的层,甚至通过注入DbContext聚合根甚至违反SRP 。 如果要提出基于意见的问题,我深表歉意,但是... 在实践中,实体框架是功能最强大且使用最广泛的ORM之一。不幸的是,您不会找到涵盖DDD的综合课程。 重要方面: 实体框架可立即使用UoW和存储库(DbSet) 使用EF,您的模型具有导航属性 与EF所有的车型都始终可用的关闭DbContext(它们被表示为DbSet) 陷阱: 您不能保证子模型仅受“聚合根”影响-您的模型具有导航属性,可以修改它们并调用dbContext.SaveChanges() 与DbContext您可以访问每一个模型,从而规避聚合根 您可以通过将ModelBuilderin 标记为字段来通过in OnModelCreating方法来限制对根对象的子对象的访问-我仍然不认为这是进行DDD的正确方法,而且很难评估这种情况将来可能导致什么样的冒险(非常怀疑) 冲突: 如果没有实现返回聚合的另一层存储库,我们甚至无法部分解决上述陷阱 通过实现额外的存储库层,我们将忽略EF的内置功能(每个DbSet都已经是仓库)并且使应用程序过于复杂 我的结论是: 请原谅我的无知,但基于以上信息-要么是实体框架 不足以用于域驱动设计,或者域驱动设计是不完善且过时的方法。 我怀疑每种方法都有其优点,但是我现在已经完全迷失了,对如何将EF与DDD调和一无所知。 如果我错了-请问至少有人能详细介绍一下如何使用EF进行DDD的简单说明(甚至提供不错的代码示例)吗?

2
IComparable接口是否过时/“有害”?
IComparable 仅以一种方式工作 假设您有一Employee堂课。在一个视图中,您要显示所有Employees按名称排序的视图-在另一个视图中按地址显示。您将如何实现?不使用IComparable,至少不是以任何惯用的方式。 IComparable 逻辑错误 通过调用使用该接口.Sort()。在显示Customer按名称排序的视图中,根本没有代码暗示如何进行排序。 另一方面,Customer该类假设如何使用它-在这种情况下,它将在按名称排序的列表中使用。 IComparable 隐式使用 与替代方案相比,很难看到在何处使用了比较逻辑,或者根本看不到。假设您使用标准IDE,并从Customer课堂开始,我将不得不 搜索所有引用 Customer 查找列表中使用的那些引用 检查这些列表是否曾经拜访过.Sort()它们 更糟的是,如果删除IComparable仍在使用的实现,则不会收到任何错误或警告。您将得到的唯一一件事就是在所有难以理解的地方出现错误的行为。 这些问题加在一起,加上需求不断变化 我之所以开始考虑这一点,是因为它对我来说是错的。我已经IComparable在我的应用程序中愉快地使用了两年了。现在,需求发生了变化,事物需要以两种不同的方式进行分类。已经注意到,遍历上一节中描述的步骤并不是一件有趣的事情。 问题 这些问题使我认为IComparable不如IComparer或.OrderBy(),以至于看不到任何其他替代方案无法更好地解决的有效用例。 使用IComparer或LINQ 总是更好吗,还是这里没有我看到的优点/用例?
11 c#  sorting  comparison 

2
单元测试以测试域对象的创建
我有一个单元测试,如下所示: [Test] public void Should_create_person() { Assert.DoesNotThrow(() => new Person(Guid.NewGuid(), new DateTime(1972, 01, 01)); } 我声称这里创建了一个Person对象,即验证不会失败。例如,如果Guid为null或生日早于01/01/1900,则验证将失败并且将引发异常(意味着测试失败)。 构造函数如下所示: public Person(Id id, DateTime dateOfBirth) : base(id) { if (dateOfBirth == null) throw new ArgumentNullException("Date of Birth"); elseif (dateOfBith < new DateTime(1900,01,01) throw new ArgumentException("Date of Birth"); DateOfBirth = dateOfBirth; } 这是测试的好主意吗? 注意:我遵循经典方法对单元模型进行单元测试(如果有)。

5
内存管理语言的参考计数模式?
Java和.NET都为你管理内存美妙的垃圾收集器,方便的方式快速释放的外部对象(Closeable,IDisposable),但只有当他们是由一个单一的对象所拥有。在某些系统中,可能需要由两个组件独立消耗资源,并且仅在两个组件都释放资源时才释放资源。 在现代C ++中,您可以使用来解决此问题,shared_ptr当所有shared_ptr都被销毁时,它将确定性地释放资源。 在面向对象的,不确定的垃圾收集系统中,是否有任何记录的,经过验证的模式来管理和释放昂贵的资源,这些资源没有一个所有者?

1
如何将MVC模式应用于C#WinForms应用程序?
我是一名C ++开发人员,此后一直使用MVC模式来设计GUI。 最近,我想重新使用C#,并设置了Windows Forms应用程序,但现在我对如何将其推送到MVC兼容结构有些迷惑。 我当前要执行的操作是“声明”为WinForms提供的类作为视图,并在后台为Model和Controller添加类。但是,我不确定如何与事件交互,例如单击按钮。通常,我会将这些事件重定向到控制器,并在完成后对View执行操作。 但是,这对于这个星座来说是非常不满意的。例如,如果我想实现“退出”按钮,则必须将事件从View重定向到Controller,并在View中实现一个额外的公共方法,然后可以从Controller调用它,而我可以在第一个实例中简单地从View调用Close()。 您对我有什么建议吗?我对C#中的Windows窗体的理解还不够好,无法尝试MVC实现吗?我给表格课一个错误的角色吗?对于这个用例,MVC仅仅是不合适的体系结构吗?
11 c#  mvc  winforms 

4
如何在C#中的接口中指定前提条件(LSP)?
假设我们有以下界面- interface IDatabase { string ConnectionString{get;set;} void ExecuteNoQuery(string sql); void ExecuteNoQuery(string[] sql); //Various other methods all requiring ConnectionString to be set } 前提条件是必须先设置/初始化ConnectionString,然后才能运行任何方法。 如果IDatabase是抽象类或具体类,则可以通过构造函数传递connectionString来某种程度地达到此前提条件- abstract class Database { public string ConnectionString{get;set;} public Database(string connectionString){ ConnectionString = connectionString;} public void ExecuteNoQuery(string sql); public void ExecuteNoQuery(string[] sql); //Various other methods all requiring …

3
实体框架和避免贫血领域模型
在我们的业务逻辑中,我们有时会定义一些类似于以下内容的方法: User.ResetCourse(Course courseToReset) 问题在于用户和课程都是实体框架代理对象。这意味着当我们在“用户”或“课程”上命中导航属性时,可能会严重打击数据库,因为这些对象不可查询,因此可以正常地遍历它们。 为了解决这个问题,我们将签名更改为: User.ResetCourse(MyDBContext db, Course courseToReset) 这意味着我们可以直接查询数据库以有效地进行所需的更改,但是将Database上下文传递给业务对象似乎太错误了。 后来我们向用户迁移了服务层,这意味着我们拥有以下内容: CourseService.ResetForUser(Course courseToReset, User forUser) 该服务引用了创建时注入的DBContext,但是现在我们的业务对象只是没有行为的数据包(例如,Anemic Domain Model)。 我们如何避免这种情况?

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.