标签: separation-of-concerns

结合PHP和HTML的首选方法?

我通过浏览phpBB2来学习PHP ,甚至向他们的数据库提交了一些mod,其他人下载并使用了这些mod.(我不相信phpBB2已经支持了phpBB3这么久了,所以v2 mods数据库不再存在.)

我最喜欢的关于phpBB的一个是他们的模板系统,它让编辑器完全分离HTML和PHP.PHP文件包含PHP:逻辑,数据库查询和激活模板.TPL文件包含模板:HTML,模板变量和专用HTML注释,以允许条件或重复块.

但是,每当我在网上看到某人的PHP代码时,它或者是一个使用单个函数等的小代码片段,或者PHP中充满了包含HTML的字符串(或者更糟糕的是,PHP与PHP散布在一起).phpBB是我看过的唯一一个实际上将语言和标记语言分开的PHP,向我建议很少有其他PHP代码库做这样的事情.

我想再次开始使用一些PHP,但这次它不会是一个phpBB论坛,它将在一个团队中.根据我的经验,PHP和HTML的分离是不常见的(如果我错了,请纠正我!).但是,我已经习惯了那个分界线,我讨厌阅读混合的PHP和HTML.

在PHP编程的"现实世界"中,首选方法是什么:

  • 带有HTML字符串的PHP文件
  • 用PHP块分解的HTML文件
  • PHP和HTML完全分开(我希望?)
  • 别的什么?

html php templates separation-of-concerns

10
推荐指数
2
解决办法
1万
查看次数

EmberJS:在相当复杂的应用程序中,对模型,商店,控制器,视图的关注点有很好的分离?

我正在做一个相当复杂的emberjs应用程序,并将它绑定到API的后端.

API调用通常不依赖于任何特定模型,但可以在响应的不同部分返回各种类型的对象,例如,对事件API的调用将返回事件,但也返回参与这些事件的媒体资产和个人.

我刚刚开始介绍这个项目,我想获得一些关于如何最好地分离问题以获得干净的可维护代码库的专家指导.

我接近这个的方式是:

  • 模型:基本上处理包含其字段和其他计算属性的记录.但是,模型不负责提出请求.
    • 例如个人,事件,图片,帖子等
  • 商店:它们本质上是缓存.例如,a eventStore将存储从服务器到目前为止(从可能不同的请求)接收的所有事件,并且还存储在索引的事件的散列中id.
    • 例如individualStore,eventStore等.
  • 控制器:它们与一组相关的API调用相关联,例如,eventsController将负责获取事件或特定事件,或创建新事件等.它们会将响应"路由"到不同的stores以便以后检索.一旦将响应发送到商店,它们就不会保留响应.
    • 例如eventsController,userSearchController等.
  • 视图:它们与特定视图相关联.通常,我的应用程序可能在不同的位置具有多个视图,例如latestEventsView在仪表板上除了具有单独的事件页面之外.
  • 模板:它们是什么.

通常,我的模板需要直接绑定到商店(例如,peopleView想要列出列表中的IndividualStore中的所有个体,按某种顺序排序).

有时,它们绑定到计算属性

alivePeople: function () { ... }.property('App.individualStore.content.@each'),
Run Code Online (Sandbox Code Playgroud)

视图中"选择"的各种过滤和排序选项应从商店返回不同的列表.你可以看到我的最后一个问题是什么是在各种过滤选项之间切换的正确的emberjs方式?

谁应该做这个过滤,视图本身或商店?

跨层的这种绑定是否合适,还是代码味道?关注点分离是好的,还是我错过了什么?控制器不应该在这里做更多的事情吗?我的观点应该直接绑定到商店吗?

任何特殊的MVC特例都更适合我的需求?

2012年4月17日更新 我的研究继续进行,特别是来自http://vimeo.com/user7276077/videoshttp://jzajpt.github.com/2012/01/17/emberjs-app-architecture.htmlhttp:/ /jzajpt.github.com/2012/01/24/emberjs-app-architecture-data.html

我想到的一些与我的设计有关的问题是:

  • 控制器发出请求(商店或模型或其他东西应该做,而不是控制器)
  • 缺少状态图 - 它们对于视图 - 控制器交互很重要(在某些时候你意识到你的交互不再那么简单)

这是状态图表的一个很好的例子:https://github.com/DominikGuzei/ember-routing-statechart-example

更新2013年1月9日

是的,它已经很长了,但这个问题最近得到了很多观点,这就是为什么我想编辑它以便人们可以理解.

自从这个问题陷入困境以来,Ember的风景发生了很大的变化,新的指南得到了很大改善.EmberJS提出了各种约定(如Rails),MVC现在定义得更好.

任何人仍然困惑应阅读所有指南,并观看一些视频: 西雅图Ember.js Meetup

目前,我正在升级我的应用程序Ember.js 1.0.0-pre2.

model-view-controller store separation-of-concerns ember.js

10
推荐指数
1
解决办法
4367
查看次数

ViewModel中的WPF相关属性是否违反了MVVM最佳实践?

这是一个详细说明的示例:

我在我的视图中使用ItemsControl动态创建一个简单的条形图,并将项目绑定到我的BarGraphViewModel中的BarViewModel集合(每个包含一个值的百分比).每个酒吧应该有不同的颜色.颜色应该从一个集合中选择,例如{Color1, Color2, ..}

集合本身是不变的,但条数将取决于具体情况.

一个简单的解决方案是创建一个简单的BarViewModel,如下所示:

public class BarViewModel
{
    public int Percentage { get; set; }

    public SolidColorBrush Stroke { get; private set; }

    public BarGraphViewModel(SolidColorBrush stroke)
    {
        Stroke = stroke;
    }
}
Run Code Online (Sandbox Code Playgroud)

(为了简洁,我省略了属性更改和验证实现)

现在我可以从我的BarGraphViewModel为每个百分比创建一个BarViewModel,并传入从我的Color集合创建的相应ColorBrush.

然后在Xaml中我将创建一个简单的ItemsTemplate,它将绑定到这些属性.

只有现在,因为它包含一个SolidColorBrush类型的属性,我的ViewModel依赖于Presentation框架,如果我想在另一个环境中使用它,它将不得不被更改.

这是否会打破MVVM最佳实践,或者它是否可以接受(你必须在某处绘制线条或者事情变得太复杂)

我只是想看看其他人对此的看法,以及是否有其他解决方案让ViewModel完全不了解Presentation Layer而不会太复杂.我可以想象ValueConverters可以提供帮助吗?

wpf mvvm separation-of-concerns

9
推荐指数
2
解决办法
1410
查看次数

何时以及如何使用枚举类而不是枚举?

最近工作的开发人员开始在枚举通常适合的地方使用类模式而不是枚举.相反,他使用类似于下面的东西:

internal class Suit
{
    public static readonly Suit Hearts = new Suit();
    public static readonly Suit Diamonds = new Suit();
    public static readonly Suit Spades = new Suit();
    public static readonly Suit Clubs = new Suit();
    public static readonly Suit Joker = new Suit();
    private static Suit()
    {

    }
    public static bool IsMatch(Suit lhs, Suit rhs)
    {
        return lhs.Equals(rhs) || (lhs.Equals(Joker) || rhs.Equals(Joker));
    }
}
Run Code Online (Sandbox Code Playgroud)

他的推理是它无形地看起来像枚举,但允许他包含与枚举有关的方法(如上面的IsMatch),它包含在枚举本身中.

他称这是一个Enumeration课程,但这不是我以前见过的.我想知道优点和缺点是什么以及我可以在哪里找到更多信息?

谢谢

编辑:他描述的另一个优点是能够为枚举添加特定的ToString()实现.

c# design-patterns enumeration separation-of-concerns

9
推荐指数
2
解决办法
2344
查看次数

使用Unity,如何注册泛型的类型映射?

我正在尝试为Entity Framework实现存储库解决方案,但是我在使用Unity注册包含泛型的类型时遇到了问题.

鉴于:

    // IRepository interface
    public interface IRepository<TEntity>
    {
        // omitted for brevity
    }

    // Repository implementation
    public class Repository<TEntity, TContext> : IRepository<TEntity>, IDisposable 
            where TEntity : class
            where TContext : DbContext
    {
        // omitted for brevity
    }

    // service layer constructor
    public MyServiceConstructor(IRepository<Account> repository)
    {
        _repository = repository;
    }
Run Code Online (Sandbox Code Playgroud)

我需要将IRepository的类型映射注册到Repository.但是我在使用这种映射的Unity语法时遇到了麻烦.

我试过以下没有运气:

container.RegisterType<IRepository<>, typeof(Repository<,>)>();
container.RegisterType<typeof(IRepository<>), Repository<,>>();
Run Code Online (Sandbox Code Playgroud)

编辑

基于@Steven响应我现在有以下实现:

// UnityRepository implementation   
public class UnityRepository<TEntity> : Repository<TEntity, MyDbContextEntities>
        where TEntity : class
{
    public UnityRepository() : …
Run Code Online (Sandbox Code Playgroud)

entity-framework unity-container separation-of-concerns repository-pattern

9
推荐指数
1
解决办法
1万
查看次数

域驱动设计 - 数据解析属于何处

在我正在开发的这个应用程序中,域名围绕着电器.该实体有几个专门版本.可以将设备提交给应用程序,这可以通过使用数据传输对象的Web服务进行.

虽然这很有效,但我现在正在考虑从几种基于文本的文件格式导入设备.考虑此工作流程:

  1. 目录观察者服务看到添加了新的设备文件
  2. 该服务使用我的应用程序中的应用程序服务来提交该文件描述的设备

现在,应用程序服务可以有一个具有以下名称和签名的方法:ApplianceService.Register(string fileContents).我认为目录观察者服务将使用此服务方法并将其传递给文件的全部内容.然后,应用程序服务将协调解析.解析文件的内容并将其转换为完整的设备实体涉及几个步骤.现在,我的问题是:

问题:这是正确的,还是解析逻辑应该存在于目录观察器服务中?每种类型的文件格式是一种域的一部分,但话又说回来,其实并非如此.在将文件从任一格式解析为实体之后,实体将永远不会知道它曾使用该格式表示过.如果解析逻辑应该存在于观察者服务中,我会将新设备作为数据传输对象传递给注册服务.

我想我关心的是设备在进入我的应用程序之前应该如何表示(使用应用程序层作为入口点).从Web服务提交设备时,我会传递一系列设备数据传输对象.这与获取可能奇怪格式化的文件并将其解析为数据传输对象不同,因为从Web服务请求到数据传输对象的映射非常简单,而不是那么复杂.

对此的任何想法都非常受欢迎.

parsing domain-driven-design separation-of-concerns

8
推荐指数
1
解决办法
867
查看次数

实体框架,应用程序层和关注点分离

我正在为我的应用程序使用Entity Framework 4.1和ASP.Net MVC 3.MVC提供了表示层,一个中间库提供了业务逻辑,实体框架类似于我猜的数据层?

我可以将实体框架代码分成一组存储库类,或者适当的变体,无论构成一个有价值的数据层,但是我在解决我遇到的设计问题时遇到了问题.

如果存在多层方法来帮助我将问题分开,那么我选择的数据持久性也应该不是表示层的关注点.问题在于,通过使用实体框架,我基本上将我的应用程序紧密地耦合到实体更改被跟踪和自动持久化的概念.

因此,假设在一个假设的世界中,我发现了一个不使用实体框架并希望将其交换掉的理由.一个设计良好的解决方案应该允许我在适当的层执行此操作并且不会影响依赖层,但是因为所有代码都是在数据层跟踪对象更改的情况下编写的,所以我只能交换实体以类似方式工作的东西的框架,例如nHibernate.

如何使用实体框架但不需要以假定数据层正在跟踪实体更改的方式编写我的代码?

对于那些仍然在自己的场景中对这个问题感到疑惑的人的更新:
Ayende Rahien写了一篇很棒的文章,打破了整个论点:http: //ayende.com/blog/4567/the-false-myth-of-encapsulating-data-access -in最DAL

architecture orm entity-framework separation-of-concerns entity-framework-4.1

8
推荐指数
1
解决办法
2658
查看次数

用PHP创建视图 - 最佳实践

我正在与其他2位开发人员合作开发一个网站.我只负责创建视图.

数据在一个对象中可用,我有读取数据然后创建XHTML页面的getters.

在不使用任何模板引擎的情况下,最佳做法是什么?

非常感谢.

php xhtml templates separation-of-concerns

8
推荐指数
1
解决办法
339
查看次数

如何告诉Ninject绑定到它没有引用的实现

我在我的ASP.NET MVC3项目中使用NinjectMVC3.

我有3层

  • Foo.Web
  • Foo.Services
  • Foo.Data

Foo.Web引用Foo.Services但不引用Foo.Data.我的一个服务看起来像这样

public class FooService : IFooService
{
    private readonly IFooRepository _fooRepository;

    public FooService(IFooRepository fooRepository)
    {
        _fooRepository = fooRepository;
    }

    // ...
}
Run Code Online (Sandbox Code Playgroud)

NinjectMVC3在Foo.Web启动时执行此引导方法

private static void RegisterServices(IKernel kernel)
{
    kernel.Bind<IFooService>().To<FooService>();
    kernel.Bind<IFooRepository>().To<FooRepository>();
    // Foo.Web doesn't know what FooRepository is
}        
Run Code Online (Sandbox Code Playgroud)

如何从Foo.Web注入FooServices依赖项?

asp.net-mvc dependency-injection ninject separation-of-concerns asp.net-mvc-3

8
推荐指数
1
解决办法
1345
查看次数

使用抽象和依赖注入,如果需要在UI中配置特定于实现的细节,该怎么办?

我有一个应用程序从输入文件加载客户端/事项编号列表,并在UI中显示它们.这些数字是简单的零填充数字字符串,如"02240/00106".这是ClientMatter班级:

public class ClientMatter
{
    public string ClientNumber { get; set; }
    public string MatterNumber { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用MVVM,它使用依赖注入和UI中包含的组合根.有一个IMatterListLoader服务接口,其中实现表示从不同文件类型加载列表的机制.为简单起见,假设只有一个实现与应用程序一起使用,即应用程序目前不支持多种文件类型.

public interface IMatterListLoader
{
    IReadOnlyCollection<string> MatterListFileExtensions { get; }
    IReadOnlyCollection<ClientMatter> Load(FileInfo fromFile);
}
Run Code Online (Sandbox Code Playgroud)

让我们说在我的初始版本中,我选择了一个MS Excel实现来加载事项列表,如下所示:

在此输入图像描述

我想允许用户在运行时配置列表开始的行号和列号,因此视图可能如下所示:

在此输入图像描述

这是MS Excel的实现IMatterListLoader:

public sealed class ExcelMatterListLoader : IMatterListLoader
{
    public uint StartRowNum { get; set; }
    public uint StartColNum { get; set; }
    public IReadOnlyCollection<string> MatterListFileExtensions { get; set; }

    public IReadOnlyCollection<ClientMatter> Load(FileInfo fromFile)
    {
        // load …
Run Code Online (Sandbox Code Playgroud)

c# abstraction dependency-injection mvvm separation-of-concerns

8
推荐指数
1
解决办法
212
查看次数