Tag: design patterns

服务 – 客户端界面,架构建议

我有一个Windows WCF服务和Web客户端。 我的服务有一种方法 [OperationContract] SubmitOrder(OrderInfo info)…. // class used to pass all relevant data [DataContract] class OrderInfo { [DataMember] OrderType Type; // general order data } 在我引入新的订单类型(由OrderInfo.Type属性控制)之前,这很棒。 您可以将新订单类型视为从一般订单(行为方面)派生而来。 每个新订单都有一些额外的属性。 实现Order的这种多态行为的最佳方法是什么? 目前,我只是在添加新订单时向OrderInfo类添加新属性。 [DataContract] class OrderInfo { [DataMember] OrderType Type; // general order data // First custom order data // Second custom order data // TODO – […]

链式异步/事件调用是否有一个有用的设计模式?

我目前不得不在Silverlight中集成大量的Web服务调用,这些调用类似于下面的代码。 在完成所有3的加载之前,不可能进行任何用户交互。 // In my view, having standard delegate methods (non-anonymous) makes the // code below even messier. // I’ve left out the EventArgs to shorten the example however // I usually use these objects in the delegate method. MyService1 service1 = new MyService1(); service1.GetAllUsersCompleted += delegate { MyService2 service2 = new MyService2(); service2.AnotherTaskCompleted += […]

IHttpModule和控制台应用程序的流畅NHibernate模式

我目前在存储库模式中使用Fluent NHibernate(+ LINQ)的C#MVC 2 Web应用程序,并使用Ninject来处理MVC控制器在存储库中传递的构造函数要求。 我的Fluent NHibernate代码目前已连接到IHttpModule,因此可以使用Web请求打开和关闭会话。 这很有效,直到我尝试将我的域模型挂钩到控制台应用程序。 首先,我决定将我的数据库逻辑移动到我的域模型中。 我猜这是不好的行为,但我在这里寻求代码设计方面的帮助,所以请随时提出建议。 我想这样做是因为我想在这个域模型上编写一个控制台app + web app,而不关心数据的存储位置和方式。 也许我应该有一个单独的“基础设施”项目,它使用域模型来执行特定的实现? 回到问题…我遇到了一个问题,似乎Fluent NHibernate的GetCurrentSession()假设你正在使用网络 – 它崩溃了,我得到一些提到WebSession的NH代码的追溯。 为了便于参考,代码如下: https : //github.com/cthielen/RightsManagement 。 我为不太具体而道歉; 我正在寻找代码设计建议,以最好地处理FNH + Linq的存储库模式,该模式适用于Web和控制台应用程序 – 并单独询问我的数据库连接(即NH逻辑)是否应该在域项目中或不。

Mvp View知道模型

我正在尝试使用MVP,我注意到我的视图必须知道模型不应该发生在我认为的MVP中。 这是一个例子: public partial class TestForm : Form, ITestView { public void LoadList(IEnumerable data) { testPresenterBindingSource.DataSource = data; } } public interface ITestView { event EventHandler Load; void LoadList(IEnumerable data); } public class TestPresenter { private ITestView view; public TestPresenter(ITestView view) { this.view = view; view.Load += View_Load; } private void View_Load(object sender, EventArgs e) […]

EventAggregator仅适用于MVVM中的ViewModels吗?

我读到有关在MVVM设计中实现的Event Aggregator模式可以帮助解耦ViewModel之间的通信。 我认为Event Aggregator真的是个好主意。 但是,第二个想法是,Event Aggregator仅由ViewModels使用吗? 模型可以发布到事件聚合器中的事件并从中订阅吗? 也许,通过这种方式,ViewModel和Model之间的数据变化可以通过EventAggregator进行关联。 这可能允许一个ViewModel从多个模型中检索信息,而不需要ViewModel来存储对所有模型的引用。 如果我这样做,是否会导致整个架构变得混乱并最终变成反模式? 什么是最佳做法? 编辑: 我想我应该解释一下为什么我这么问。 我看到三个可能的问题: 首先 ,使用DI,我的ViewModel包装了Model。 然后,我的ViewModel可以与我的模型通信。 但是,不是相反。 因此,如果我的模型本身或外部都有一些更改,则需要一种方法来通知其ViewModel。 其次 ,除了ViewModels必须与其他ViewModel进行通信之外,在我看来,模型必须与ViewModel一样多,甚至更多地与其他模型进行通信。 这些导致我认为我可以将所有内容链接到EventAggregator。 第三 ,我发现在某些情况下,单个ViewModel需要从多个模型中提取信息。 但是通过ViewModel构造函数的dependency injection,它只能从一个Model中读取。

最好检测exception并抛出它们或者只是让运行时抛出它们?

让我们说有这样的设置: public class MyClass { public void DoSomething(string Data) { //if (String.IsNullOrWhiteSpace(Data)) //throw new NullReferenceException(); //Do something with Data and let it throw?? } } public class EntryPointClass { public void DoIt(string Data) { var logicClass = new MyClass(); try { logicClass.DoSomething(Data); } catch(Exception ex) { } } } 在DoSomething中,我可以检测到问题并抛出exception。 在测试EntryPointClass时,我可以测试预期结果或测试catch中发生的事情。 为什么抛出exception而不是等待一个exception更好? 无论哪种方式,我们都抓住了它!

使用DTO和BO

关于DTO / BO的一个问题是关于何时通过/返回DTO以及何时通过/返回BO。 我的直觉反应告诉我总是将NHibernate映射到DTO而不是BO,并且总是传递/返回DTO。 然后,每当我需要执行业务逻辑时,我都会将我的DTO转换为BO。 我这样做的方式是我的BO将有一个构造函数,它接受一个参数,该参数是我的DTO和BO实现的唯一参数的接口类型(定义了必需的字段/属性)。 然后我可以通过在构造函数中传递DTO来创建我的BO(因为两者都实现了相同的接口,它们都具有相同的属性)然后能够使用该BO执行我的业务逻辑。 然后我还可以将BO转换为DTO。 但是,我还看到人们似乎只与BO一起工作,并且只在后台使用DTO进行用户,看起来没有DTO。 这种架构与使用BO相比有什么好处/下降? 我应该总是传递/返回DTO或BOs或混合和匹配(似乎混合和匹配可能会让人困惑)?

版本化序列化文件

我有一个工作的应用程序将文档(类型IDocument)序列化到磁盘。 从那里开始有另一个我可以打开该文档的应用程序(IDocument实现IPrintDocument)供查看。 我们假设我已经将一个IDocument写入磁盘,然后一周后,一个字段被添加到IDocument对象中。 编写文件的程序和打开它们的程序都使用IDocument的这个新“版本”进行更新。 在尝试打开以前的IDocument版本时,它会破坏(我假设 – 没有机会检查,我在这里outlook)。 是否有一种已知的模式可以缓解这种问题?

如何用存储库模式问题解决这个generics?

我从上一个问题得到了这个代码,但它没有编译: public interface IEntity { // Common to all Data Objects } public interface ICustomer : IEntity { // Specific data for a customer } public interface IRepository : IDisposable where T : IEntity { T Get(TID key); IList GetAll(); void Save (T entity); T Update (T entity); // Common data will be added here […]

以下哪些例子代表DDD的正确使用?

我已经和DDD合作了几个月了,我遇到了一些我不确定的事情。 举一个将Product添加到Order对象的简单示例。 从我们的Controller中,我们通过UI传递了一个int ,它表示数据库中的Product 。 以下哪两个例子是正确的(如果它们都错了,请告诉我)? 示例一: public class OrderController { // Injected Repositories private readonly IProductRepository _productRepository; // Called by UI public void AddProduct(int productId) { Order order = …; // Persisted Order Product product = _productRepository.GetProduct(productId); order.AddProduct(product); } } Controller实例化产品本身并通过以下方法添加它: void AddProduct(Product product) { productList.Add(product); } 示例二: public class OrderController { // Injected […]