C# 领域驱动设计问题

C# 领域驱动设计问题,c#,domain-driven-design,C#,Domain Driven Design,我是DDD的新手,如果我没有正确使用术语,请原谅我 我使用的是C#MS/SQL和NHibernate 我有一个类调用支付,这个支付有一个PaymentCurrency,每个都是数据库中的一个实体 嗯。在我的域模型中,我希望能够将支付创建为 Payment p = new Payment( 100 ) // automatically uses the default currency (defined in the db ) 或 但在我看来,为了用dfault货币初始化我的域对象,我需要用持久

我是DDD的新手,如果我没有正确使用术语,请原谅我

我使用的是C#MS/SQL和NHibernate

我有一个类调用支付,这个支付有一个PaymentCurrency,每个都是数据库中的一个实体

嗯。在我的域模型中,我希望能够将支付创建为

Payment p = new Payment( 100 ) // automatically uses the default currency (defined in the db )

但在我看来,为了用dfault货币初始化我的域对象,我需要用持久性知识污染域模型。i、 e.在完成默认付款构造函数之前,我需要从db加载默认付款对象

我想象的构造器有点像

public Payment( int amount ) {
   Currency = Repository.LoadDefaultCurrency();  // of cource defualt currency would be a singleton
}

public Payment( int amount, Currency c ) {
   Currency = c; // this is OK since c is passed in from outside the domain model.
}

谢谢你的建议。

你的答案是依赖注入

利用它,不要把模型和配置混为一谈。 如果您需要创建具有所需金额和货币的付款,只需执行以下操作:

var currency = injectedCurrencyRepository.GetByName("JPY");
var p = new Payment(100.00m, currency);
不要假定为默认货币

或者,在最糟糕的情况下,您可以添加接口:

public interface ICurrencyProvider {
   Currency GetCurrency();
}
// Implment the default:
public class DefaultCurrencyProvider : ICurrencyProvider {
   public Currency GetCurrency() {
      return new Currency("AUD");
   }
}

// And the Payment constructor will look like:
public Payment(decimal amount, ICurrencyProvider currencyProvider) {
   c = currencyProvider.GetCurrency();
}
因此,默认情况下,您可以将(使用Windsot、Unity或其他工具)货币提供者注入到实例化付款的方法中:

var p = new Payment(100.00m, defaultCurrencyProvider);

我不认为有一个完美的解决方案,但您可以通过将默认货币(和类似属性)存储在其他类(例如“DomainDefaults”)上,并从逻辑上位于域对象“上方”的另一段代码初始化,来避免将持久性代码放入域类中。当然,您必须确保在创建任何域对象之前调用了初始化代码。如果没有初始化,它可能会抛出一个异常,所以您至少可以轻松捕获它

所以构造函数变成了

public Payment( int amount )
{
   Currency = DomainDefaults.DefaultCurrency;
}
在你初始化NHibernate后不久,你会打电话:

DomainDefaults.DefaultCurrency = Repository.GetCurrency("JPY")

我不明白为什么这和坚持有任何关系

如果我是用Java编写的,我会从应用程序的语言环境中获取默认货币


告诉我CultureInfo是C#等价物。也许你应该在你的设计中尝试一下,不要使用诸如“JPY”和持久性之类的字符串。

-1来自我-我相信还有另一种方法可以获取货币信息,而不必求助于持久性或依赖性注入。这是一个好主意。。。对于货币的情况,但它没有;我不能真正解决根本问题。您真正要做的就是将持久性从数据库移动到OS注册表存储库。因此,例如,如果您移动到Unix,则区域设置storafe将不同,因此我需要更改我的域模型…移动到Unix?我猜你在想Mono。我对Java更为熟悉,所以我假设——也许是错误的——如果我在编写web应用程序,我会从客户端浏览器设置的HTTP头中获得区域设置/文化。
DomainDefaults.DefaultCurrency = Repository.GetCurrency("JPY")