私はActive Recordと単方向APIを使って設計されたビジネスエンティティを持つビジネスレイヤを持っています。単方向APIでDIコンテナを渡すのは避けてください。
- コードを複雑にすることなく、DALから構築されたオブジェクトにid値を渡すなど、実行時の値をどのように処理する必要がありますか?これはパラメータのオーバーライドで行うことができますか?製品は、容器をラップルートでどのように他のビジネスエンティティを作成し、私もダウンした容器を渡しておりません場合は、依存関係を渡します(アンチパターン/サービスロケータのそれをより作る)
Product.FindCustomer
とCustomer.FindDocument
public class Product
{
private IUnityContainer container;
public void RegisterType<T>() ...
public void RegisterType<TFrom, TTo>() ...
public Customer FindCustomer(string customerNumber)
{
var id = context.Customers
.Where(p => p.CustomerNumber == customerNumber)
.Select(p => p.Id)
.Single();
var customer = container.Resolve<Customer>(...); // param override?
customer.Load();
return customer;
}
}
public class Customer : BusinessEntity<Data.Customer, Guid>
{
private readonly IDocumentFileProvider provider;
public Customer(IDataContext context, IDocumentFileProvider provider) : base(context)
{
this.provider = provider;
}
public Customer(IDataContext context, IDocumentFileProvider provider, Guid id) : base(context, id)
{
this.provider = provider;
}
public Document FindDocument(string code)
{
var id = context.Documents
.Where(p => p.CustomerNumber == customerNumber)
.Select(p => p.Id)
.Single()
var document = new Document(context, provider, id); // Here is the issue
document.Load();
return document;
}
}
public class Document : BusinessEntity<Data.Document, Guid>
{
public Document(IDataContext context, IDocumentFileProvider provider) : base(context)
{
this.provider = provider;
}
public Document(IDataContext context, IDocumentFileProvider provider, Guid id) : base(context, id)
{
this.provider = provider;
}
public IDocumentFile GetFile()
{
return provider.GetFile();
}
}
である簡単に他のクラスです。
public abstract class ActiveRecord<TEntity, TKey>
{
protected ActiveRecord(IDataContext context)
{
}
public virtual void Load() ...
public virtual void Save() ...
public virtual void Delete() ...
}
public abstract class BusinessEntity<TEntity, TKey> : ActiveRecord<TEntity, TKey>
{
protected BusinessEntity(IDataContext context) : base(context)
{
}
protected BusinessEntity(IDataContext context, TKey id) : this(context)
{
}
...
}
階層が非常に深くなり、より短い例することができます
var customer = product.FindCustomer("123");
var account = customer.FindAccount("321");
var document = account.FindDocument("some_code");
var file = document.GetFile();
私の目標の一つがAにある)ドメイン、およびBをモデル化するには)理解することは非常に簡単にAPIを提供しています。現在のところ、BALはService Locatorを使用していますが、これを適切なIoC/DIとコンテナに置き換えることを試しています。
APIが深く、より多くの依存関係が必要な場合、すべての上位クラスのコンストラクタはかなり長くなる可能性があり、もはや結束するように見えなくなる可能性があります。