在工作中,我已經投入開發一個傳統的enterprice應用程序,由於設計不穩定和不穩定,這些應用程序在過去幾個月仍處於生產和停滯狀態。C#應用程序體系結構-EF5和理解服務層
因此,我們已經開始使用EF5並將一些設計模式/圖層應用於我們的應用程序。
我在努力理解的是:在我們的例子中,服務層應該做什麼?它會過度架構,還是會提供一些好處而不添加不必要的複雜性?
讓我們來告訴你什麼是我們這麼遠:
- 我們引入了EF(代碼先用波蘇斯)來映射我們的傳統數據庫(效果相當好)
- 我們創建庫對於我們需要在新的數據層最東西(具體實施中,我沒有看到關於使用通用回購關心的分離 - 任何形式的好處。)
現在,在特定情況下,它是關於價格計算一篇文章 - 通過從弧線獲得價格直接或從文章所在的組(如果沒有指定價格)。它變得複雜得多,因爲還有不同的價格表(取決於訂單的完整價值)以及取決於客戶誰也可以有特價等。
所以我的主要問題是:誰是負責獲得正確的價格?
我的想法是: 順序必須知道它包含的項目。另一方面,這些物品必須知道他們的價格是什麼,但是訂單不知道如何計算物品的價格,只需要總結其成本。
的我此刻的代碼Excert:
ArticlePrice(POCO,映射很快就被通過流體API交換)
[Table("artikeldaten_preise")]
public class ArticlePrice : BaseEntity
{
[Key]
[Column("id")]
public int Id { get; set; }
[Column("einheit")]
public int UnitId { get; set; }
[ForeignKey("UnitId")]
public virtual Unit Unit { get; set; }
[Column("preisliste")]
public int PricelistId { get; set; }
[ForeignKey("PricelistId")]
public virtual Pricelist Pricelist { get; set; }
[Column("artikel")]
public int ArticleId { get; set; }
[ForeignKey("ArticleId")]
public virtual Article Article { get; set; }
public PriceInfo PriceInfo { get; set; }
}
文中的價格信息庫:
public class ArticlePriceRepository : CarpetFiveRepository
{
public ArticlePriceRepository(CarpetFiveContext context) : base(context) {}
public IEnumerable<ArticlePrice> FindByCriteria(ArticlePriceCriteria criteria)
{
var prices = from price in DbContext.ArticlePrices
where
price.PricelistId == criteria.Pricelist.Id
&& price.ArticleId == criteria.Article.Id
&& price.UnitId == criteria.Unit.Id
&& price.Deleted == false
select price;
return prices.ToList();
}
}
public class ArticlePriceCriteria
{
public Pricelist Pricelist { get; set; }
public Article Article { get; set; }
public Unit Unit { get; set; }
public ArticlePriceCriteria(Pricelist pricelist, Article article, Unit unit)
{
Pricelist = pricelist;
Article = article;
Unit = unit;
}
}
PriceService(確實有一個horriffic代碼的氣味...)
public class PriceService
{
private PricelistRepository _pricelistRepository;
private ArticlePriceRepository _articlePriceRepository;
private PriceGroupRepository _priceGroupRepository;
public PriceService(PricelistRepository pricelistRepository, ArticlePriceRepository articlePriceRepository, PriceGroupRepository priceGroupRepository)
{
_pricelistRepository = pricelistRepository;
_articlePriceRepository = articlePriceRepository;
_priceGroupRepository = priceGroupRepository;
}
public double GetByArticle(Article article, Unit unit, double amount = 1, double orderValue = 0, DateTime dateTime = new DateTime())
{
var pricelists = _pricelistRepository.FindByDate(dateTime, orderValue);
var articlePrices = new List<ArticlePrice>();
foreach (var list in pricelists)
articlePrices.AddRange(_articlePriceRepository.FindByCriteria(new ArticlePriceCriteria(list, article, unit)));
double price = 0;
double priceDiff = 0;
foreach (var articlePrice in articlePrices)
{
switch (articlePrice.PriceInfo.Type)
{
case PriceTypes.Absolute:
price = articlePrice.PriceInfo.Price;
break;
case PriceTypes.Difference:
priceDiff = priceDiff + articlePrice.PriceInfo.Price;
break;
}
}
return (price + priceDiff) * amount;
}
public double GetByPriceGroup(PriceGroup priceGroup, Unit unit)
{
throw new NotImplementedException("not implemented yet");
}
//etc. you'll get the point that this approach might be completely WRONG
}
我最終的問題是: 如何正確建模我的問題?這是否正確,我是否正在爲我的代碼構建架構? 我的服務層如何正確地看起來像?我寧願有一個ArticlePriceService,一個ArticleGroupPriceService等?但是誰會連接這些部件並計算出正確的價格?例如,是具有「GetPrice」方法的OrderItemService的責任?但是,然後再orderItemService將不得不知道其他服務..
請嘗試爲我提供可能的解決方案有關架構,以及哪些對象/層做什麼。
如果您需要更多信息,請隨時提出其他問題!
如果你能甚至第三你原來的問題,你會得到更多的人閱讀這降低了你的問題一半的大小... – oleksii
我接受建議,但我實在不明白我怎麼能在沒有拿走重要信息的情況下將其裁掉:/ – bberger