Tag: 设计

C#中的灵活日志界面设计

我想编写自己的Logging类(在C#中),它实现了一个标准接口,我可以从代码的任何部分调用它。 我的想法是让多个Log类实现Logger接口,每个接口都针对其特定的日志目的地,例如,FileLogger将实现日志记录到文件,TextBox记录器将实现登录到Form中的多行TextBox,DBLogger将实现日志记录到数据库表等 此外,每个记录器类可以具有嵌套的记录器或链式记录器类,因此从应用程序代码单次调用Log()方法可以在多个目的地中记录消息; 示例在单个调用中记录到Form上的文件和文本框。 我面临的困难是: 通常我会记录一个正在运行的日志文件(其中包含调试所需的所有日志消息),一个审阅日志文件(其中只包含要由用户审阅的日志消息,或需要用户操作的日志消息),多行文本框屏幕(将复制所有日志消息以向用户提供进度指示),以及另一个多行文本框(将仅记录用户要查看的消息)。 当我调用logger.Log(消息)时,某些消息可能不适用于特定的日志目标。 例如,某些消息可能仅记录在正在运行的日志文件或进度文本框中,但不会记录在用户评论文本框中,反之亦然。 由于记录器将被链接以便单个函数调用可以登录到所有必需的目标,因此特定记录器如何识别日志消息不适用于它并因此忽略日志消息? 我的示例日志界面是: public interface Logger { public void Log(string msg); public void Log(string msgType, string msg); public void InitLogSession(); public void EndLogSession(); public void AddLogger(Logger chainedLogger); public void RemoveLogger(Logger chainedLogger); } public class FileLogger : Logger { //implement methods } public class TextBoxLogger : Logger { //implement […]

从DTO创建BO的模式/策略

我喜欢使用属性包对象(DTO)定义我的服务器接口的方法,但我不喜欢这样编写代码: void ModifyDataSomeWay(WibbleDTO wibbleDTO) { WibbleBOWithMethods wibbleBO = new WibbleBOWithMethods(); wibbleBO.Val1 = wibbleDTO.Val1; wibbleBO.Val2 = wibbleDTO.Val2; } 这种复制代码很难编写。 如果复制代码是不可避免的,那么你把它放在哪里? 在BO? 在工厂? 如果可以手动避免写锅炉板代码那么如何? 提前致谢。

注入的依赖项是公共可访问还是私有?

是否应将依赖项存储到具有私有setter和public getter的私有字段或属性? 这适用于构造函数DI。 为了清楚起见,在属性示例中,我不希望将这些添加到附带的接口,除非它有意义 – 即它们只在实现类型中可见: interface IFoo { void DoSomething(); } class Foo : IFoo { private readonly IService dependency; public Foo(IService dependency) { this.dependency = dependency; } } class Bar : IFoo { public Foo(IService dependency) { this.Dependency = dependency; } public IService Dependency { get; private set; } }

MVVM – 视图逻辑:view vs viewmodel

“应该”视图逻辑正常驻留在哪里? 在视图(包括后面的代码)或viewmodel中? 通过逻辑,我理解用于修改视图的任何内容(使其动态化),根据某些条件更改其元素属性: Visibility , IsEnabled , Content等。 我在选择正确的陈述之间苦苦挣扎: ViewModel负责所有视图“属性”,如果视图需要一些逻辑 – 这应该是viewmodel的工作。 View是一个viewmodel表示,viewmodel只需要最小的公开模型,因此逻辑应该是视图的一部分。 视图中的逻辑。 举例来说,显示一些文字: 通过查看此xaml,您知道viewmodel中有2个属性: TextAvailable和TextOk ,用于有条件地显示Text 。 使用数据触发器可以实现相同。 方式无关紧要,重点是: 逻辑在视图中 。 人们必须彻底了解两种观点:逻辑和实施 。 viewmodel中的逻辑。 Xaml更容易: 逻辑在viewmodel中 : public bool ShowText => TextAvailable && TextOk; 但这需要通知支持,通常订阅/取消订阅事件(如果确定性取消订阅很复杂,则使用弱事件),以便能够告知视图OnPropertyChanged(nameof(ShowText))是否有任何相关属性被更改。 因此, 实现在许多方法/属性中很好地分布。 我个人更喜欢拥有简单的viewmodel和相当复杂的视图(xaml),充满逻辑。 最近我发现了一种让逻辑变得非常酷的方法(没有额外的元素,更容易看到)。 我理解这两种方法都可以使用,因此问题基于意见,但我不想在我的软件中以疯狂的比例混合使用这两种方法。 哪种方式更干净,并且会被另一位MVVM程序员更好地接受? 我应该更喜欢什么?为什么?

如何告诉Ninject为嵌套构造函数注入相同的实例?

我有一个Windows服务应用程序,我想在我的服务类中使用Ninject。 有一些服务类使用其他服务类,比如说“低级”或更通用的服务类。 每个服务通常都需要一个数据库访问存储库。 例如,我有一个IRepository接口,一个IServices1和一个IServices2接口。 后两者有Services1和Services2实现,两者都有一个IRepository类型的构造函数参数。 现在假设Services1的实现想要使用IServices2接口的一些方法,所以我将另一个构造函数参数添加到Services1,类型为IServices2。 现在,当我手动实例化Services1类时,我会这样做: var repo = new MyRepository(); // implementing IRepository var service1 = new Services1(repo, new Services2(repo)); 这样我就可以确保两个服务都可以使用相同的存储库(这对我来说是一个基本要求)。 如何使用Ninject为此scneario为我准备一个IServices1实例并使用正确的IRepository注入? 或者这种方法有任何重大设计错误吗? 我不是在MVC平台上,所以我没有这里的请求范围,我认为如果它是MVC我会做任务。

我们还需要Iterator设计模式吗?

嗨伙计们,我正在学习设计模式,我找到了Iterator。 我们还需要使用它吗? 由于我们有collections,我很困惑为什么我们仍然需要Iterator设计模式。 谢谢

为什么所需的Startup类不需要实现适当的接口,比如IStartup?

使用katana,为什么Startup类不应该实现相应的接口,例如: interface IStartup { void Configuration(IAppBuilder app); } public class MyStartup : IStartup { public void Configuration(IAppBuilder app) { … } } 我认为开发人员可以更直观地理解他们应该将WebApp.Start方法作为T参数提供什么而不是猜测和查找示例,它应该更明确: public void Start() where T : IStartup

如何使用StaticResource在XAML中定义DataContext

我想通过XAML中的静态资源声明一个DataContext,作为Northwind数据库中Customers的绑定。 我可以在代码(C#)中轻松完成此操作,但想学习如何在XAML中完成。 我已经尝试了所有可以找到的例子,但它们都不适合我。 我认为问题出在我标记为[Option1]和[Option2]的两行XAML代码行中。 你能澄清一下这个语法究竟应该是什么吗? C# namespace DataGridEF { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); bModel1 bNorthWind = new bModel1(); //this.DataContext = bNorthWind; bNorthWind.GetCustomers(); } } } namespace DataGridEF { public class bModel1 { List _Customers; public List Customers { get { return _Customers; } set { _Customers = value; […]

C#hack:接口和抽象类之间的低级别差异

这是一个关于C#基础知识的哲学问题:我想知道完全抽象类可以模拟接口的接近程度。 假设我们有以下界面: public interface INativeInterface { void PerformAction(); String Property { get; set; } } 以及抽象类: public abstract class ISimulatedInterface { public abstract void PerformAction(); public abstract String Property { get; set; } } 他们有很多共同点,不是吗? 我所知道的差异是: 多重inheritance不适用于抽象类 显式实现不适用于抽象类 使用reflection或类似的东西可以跳过这些限制吗? 我意识到接口和抽象类在root中是不同的:接口声明了“ 可以表现得像 ”的条件,抽象类 – “ 是一种 ”,但即使这似乎是如此接近以至于这些实体之间的低级别差异要讨论的。 这个问题甚至可以听起来像“你会用C ++创建一个接口”。

UML类图:这是如何编写抽象方法和属性的?

当我第一次创建一个小型C#项目的uml类图时,我遇到了一些属性问题。 最后,我在开始时将属性添加为带有<>的变量。 现在我想知道如何用抽象方法解决这个问题? 我应该将<>添加到方法中吗? 我做这样的事情: ———————————– | <> | | MyClass | ———————————– |<> + a : int | |<> + b : string | ———————————– |<> # Job() : void | |<> # Job2() : string | |- SomeNonAbstractMethod() : void | ———————————– 这好吗? 有什么建议?