我正在学习ASP.NET MVC,我喜欢它.但是,我对使用命名空间模型的正确方法感到非常困惑.
在剖析NerdDinner示例应用程序时,我注意到Models文件夹中的所有内容都属于Models命名空间.数据映射类,存储库,错误规则管理等属于相同的命名空间级别.
据我所知,这个文件夹的灵感来自像Rails和朋友这样的框架,并且需要证明MVC标题中的M是合理的; 自动模型命名空间是否会破坏编写可在不同系统和实现中分离和移植的业务逻辑的任何机会?
我应该将我的业务逻辑命名为此Model命名空间下面还是应该完全忽略它并以更加框架独立的方式对我的类进行分类?
是否有任何复杂和良好的ASP.NET MVC示例应用程序可以证明这一点?
我正在寻找有关如何处理以下设计问题的建议(使用基于stackoverflow的虚构示例).我试图避免贫血领域模型,并寻求针对此类案例的一般"最佳实践"建议.
假设正在为stackoverflow开发一个新功能,只要他/她的问题收到10个upvotes就会向问题所有者发送电子邮件通知.
域对象模型是这样的:
public class Question
{
string Question { get; set; }
IList<Votes> Upvotes { get; set; }
User Owner { get; set; }
public void AddUpvote(Vote upvote)
{
Upvotes.Add(upvote);
}
}
Run Code Online (Sandbox Code Playgroud)
更改AddUpvote()
以获取IEmailerService
参数并在AddUpvote()
方法中执行逻辑.
public void AddUpvote(Vote upvote, IEmailerService emailer)
{
Upvotes.Add(upvote);
if ( Upvotes.Count == 10 )
{
emailer.Send(Owner.EmailAddr);
}
}
Run Code Online (Sandbox Code Playgroud)检测此状态AddUpvote()
并AddUpvote()
从IoC容器中解析IEmailService(而不是将IEmailerService作为参数传递).
在调用的外部服务对象中检测此状态question.AddUpvote()
.
public void UpvoteClickHandler(Question question)
{
question.AddUpvote(new Upvote());
if ( question.Upvotes.Count == 10 …
Run Code Online (Sandbox Code Playgroud)我有一节课:时间表.
public class Schedule {
private int locationNum;
private int cost;
private String costReason;
private Date weekOfChange;
private Date dayOfChange;
private String changeReason;
// and all those getters and setters
public Schedule(int locationNum, int cost, String costReason, Date weekOfChange, Date dayOfChange, String changeReason) throws ApplicationException {
//change is all or nothing - all attributes are present or none
if((weekOfChange!=null && dayOfChange!=null && changeReason!=null) || (weekOfChange==null && dayOfChange == null && changeReason == null)) {
this.weekOfChange = weekOfChange;
this.dayOfChange = dayOfChange; …
Run Code Online (Sandbox Code Playgroud) 什么是最好的方式和原因?
V1:
try
{
var service = IoC.Resolve<IMyBLService>();
service.Do();
}
catch(BLException ex)
{
//Handle Exception
}
Run Code Online (Sandbox Code Playgroud)
V2:
var service = IoC.Resolve<IMyBLService>();
var result = service.Do();
if (!result.Success)
{
//Handle exception
}
Run Code Online (Sandbox Code Playgroud) .net architecture domain-driven-design business-logic n-tier-architecture
我读过 scott millett 写的《专业 asp.net 设计模式》一书,在他的示例中,他在 Validate() 方法中验证了他的业务逻辑,如果任何违反的规则被破坏,它们将被添加到集合中,并且服务层会调用一个方法该模型称为 GetBrokenRules()。
现在我还阅读了几本有关 DDD 的书籍、博客和论坛,它们说在 DDD 中对象永远不应该进入无效状态。
我见过的有关 DDD 的所有示例都会在业务规则被破坏时抛出错误,而不是传回被破坏的规则的集合。我什至下载了 scott millett 的最新源代码,他现在更改了代码,现在会抛出错误,而不是传回损坏的规则列表。我还在其他 DDD 代码示例中看到了相同的方法。
我正在与一位团队成员进行辩论,他认为抛出错误是资源昂贵的,我们不应该抛出错误,而应该像我们目前所做的那样返回一组损坏的规则。然而,通过这样做,我们传递了一个无效的对象,因为它包含不可靠的数据,并且我们只在最后检查其破坏的规则。
我只是在想其他人对这个问题的看法。一旦业务规则失败,我们是否应该立即抛出错误?如果是这样,您能强调一下这样做的优点和缺点吗?我不知道 .net 中抛出错误的资源消耗有多大,所以我不能反对这一点,但我想知道这是否也是个人意见而不是编码标准的问题。
麦克风
domain-driven-design business-logic try-catch business-rules asp.net-mvc-3
我正在构建具有以下层的应用程序
数据 - 实体框架上下文实体 - 实体框架POCO对象服务 - 由WebApi调用以加载/保存实体WebApi -
现在我相信我应该将我的业务逻辑放入服务层,因为我有实体服务,例如,我有Family对象和Family Service.
要使用FluentValidation创建验证对象,似乎必须从AbstractValidator继承,因为我的服务已经从一个对象继承这是不可能的(或者是它)?
我想我唯一的选择是在服务层创建一个FamilyValidator并从服务中调用此验证器?
fluentValidation是我最好的选择,还是我在这里混淆了什么?
c# entity-framework business-logic fluentvalidation asp.net-web-api
[背景]
所以,我有一个C#应用程序,在我到达之前编写.我此时并不在开发组织中,但我是互联网营销组织中的子组中的技术主管.我的职责是流程自动化,最小的桌面支持以及使我们的生活更轻松的自定义应用程序.
[/背景]
[应用详情]
我们有一个应用程序,可以从URL列表中创建自定义数据库文件.它被设计为具有一个输入文件,以及两个使用这些db文件的应用程序的输出文件.两个输出文件之间差异的规则被编译到代码中.
[/ app详情]
是否应该使用业务逻辑编译内部C#应用程序,如果不重新构建它就无法更改?
这篇文章http://www.theserverside.net/tt/articles/showarticle.tss?id=Top5WSMistakes 鼓励我为业务逻辑层创建Web服务,但很多人在数据访问层中使用它.
我想创建一个项目,我想从桌面应用程序,网站和手机访问相同的数据存储库.你会推荐我什么?
在任何情况下,为两个层实现Web服务可能是个好主意吗?
我正在编写一个网站的功能区/成就系统,我必须为我的系统中的每个功能区编写一些逻辑.例如,如果您是第一批注册到该网站的2,000人或者在论坛中发布了1,000个帖子后,您就可以获得一个功能区.这个想法非常类似于stackoverflow的徽章,真的.
因此,每个功能区显然都在数据库中,但它们还需要一些逻辑来确定用户何时获得功能区.
在我编写它的方式,Ribbon
是一个简单的界面:
public interface Ribbon {
public void setId(int id);
public int getId();
public String getTitle();
public void setTitle(String title);
public boolean isEarned(User user);
}
Run Code Online (Sandbox Code Playgroud)
RibbonJpa
是一个实现Ribbon
接口的抽象类,避免了isEarned()
方法的定义:
@Entity
@Table(name = "ribbon")
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "ribbon_type")
public abstract class RibbonJpa implements Ribbon {
@Id
@Column(name = "id", nullable = false)
int id;
@Column(name = "title", nullable = false)
private String title;
@Override
public int getId() {
return id;
}
@Override
public void …
Run Code Online (Sandbox Code Playgroud) 也许这个问题有点白痴,因为在业务层可以保证一切,但我不知道是否应该让efford为业务逻辑层带来这种保证.
例:
我在ASP.NET应用程序中有一个业务逻辑,如果用户登录,用户只能访问产品列表的第二页.在ASP.NET应用程序中,WebSecurity会关注用户登录,所以我可以' t在业务层中调用WebSecurity方法.我怎么处理它呢?只在UI层中保留此法律?
asp.net-mvc design-patterns domain-driven-design business-logic
business-logic ×10
asp.net-mvc ×2
c# ×2
java ×2
.net ×1
architecture ×1
automation ×1
autowired ×1
jpa-2.0 ×1
nerddinner ×1
oop ×1
spring ×1
try-catch ×1
validation ×1
web-services ×1