私の現在のサービスおよびビジネスレイヤーの実装は、次のように簡単です。
public class MyEntity { }
// Business layer
public interface IBusiness { IList<MyEntity> GetEntities(); }
public class MyBusinessOne : IBusiness
{
public IList<MyEntity> GetEntities()
{
return new List<MyEntity>();
}
}
//factory
public static class Factory
{
public static T Create<T>() where T : class
{
return new MyBusinessOne() as T; // returns instance based on T
}
}
//Service layer
public class MyService
{
public IList<MyEntity> GetEntities()
{
return Factory.Create<IBusiness>().GetEntities();
}
}
現在の実装にいくつかの変更が必要でした。データである理由は時間の経過とともに増大し、サービスとクライアントは大量のデータを処理できません。現在のサービスにページ付けを実装する必要がありました。また、いくつかの機能(データがしきい値を超えた場合のリターン障害、フィルターの適用など)も期待されるため、設計を更新する必要があります。
以下は私の新しい提案です。
public interface IBusiness
{
IList<MyEntity> GetEntities();
}
public interface IBehavior
{
IEnumerable<T> Apply<T>(IEnumerable<T> data);
}
public abstract class MyBusiness
{
protected List<IBehavior> Behaviors = new List<IBehavior>();
public void AddBehavior(IBehavior behavior)
{
Behaviors.Add(behavior);
}
}
public class PaginationBehavior : IBehavior
{
public int PageSize = 10;
public int PageNumber = 2;
public IEnumerable<T> Apply<T>(IEnumerable<T> data)
{
//apply behavior here
return data
.Skip(PageNumber * PageSize)
.Take(PageSize);
}
}
public class MyEntity { }
public class MyBusinessOne : MyBusiness, IBusiness
{
public IList<MyEntity> GetEntities()
{
IEnumerable<MyEntity> result = new List<MyEntity>();
this.Behaviors.ForEach(rs =>
{
result = rs.Apply<MyEntity>(result);
});
return result.ToList();
}
}
public static class Factory
{
public static T Create<T>(List<IBehavior> behaviors) where T : class
{
// returns instance based on T
var instance = new MyBusinessOne();
behaviors.ForEach(rs => instance.AddBehavior(rs));
return instance as T;
}
}
public class MyService
{
public IList<MyEntity> GetEntities(int currentPage)
{
List<IBehavior> behaviors = new List<IBehavior>() {
new PaginationBehavior() { PageNumber = currentPage, }
};
return Factory.Create<IBusiness>(behaviors).GetEntities();
}
}
専門家は、私の実装が正しいか、それとも私がそれを殺しすぎているかどうかを私に提案してください。それがどのデザインパターンであるかを修正する場合-デコレータまたはビジター。
また、私のサービスはJSON文字列を返します。この動作コレクションを使用して、エンティティ全体ではなく、選択したプロパティのみをシリアル化するにはどうすればよいですか。プロパティのリストは、リクエストとしてユーザーから提供されます。(カラムピッカーの種類)