필자는 n 계층 데이터 액세스를위한 새로운 패턴으로 놀아 왔으며 매우 유연하고 구현하기 쉬운 것으로 보이는 패턴을 발견했습니다. 기본적으로 DB에서 기본 데이터 액세스, 분산 캐싱, 로컬 캐싱 등 다양한 데이터 레이어를 즉석에서 다양한 데이터 레이어로 만들 수있는 솔루션이 필요했습니다.일반 다중 레이어 데이터 액세스 패턴?
아래의 코드는 쉽게 재사용되고 매우 효율적입니다. 이전에 전적으로 하드 코딩 된 솔루션보다 몇 시간 이상 오래 걸립니다.
어떻게 보이나요? 이것이 더 잘 구현 될 수있는 방법이 있습니까? 어떤 일반적인 생각이나 비판? 유사한 패턴을 사용한 사람들의 의견은 무엇입니까?
기본 클래스 :
public class DataAdapterFactory<T> where T : class { private DataAdapter<T> Adapter; public DataAdapterFactory(DataAdapterBase<T> Base) { Adapter = Base; } public void Extend<U>() where U : DataAdapterExtender<T>, T, new() { DataAdapterExtender<T> Extender = new U(); Extender.BaseAdapter = Adapter as T; Adapter = Extender; } public T GetAdapter() { return Adapter as T; } } public class DataAdapter<T> where T : class { } public class DataAdapterBase<T> : DataAdapter<T> where T : class { } public class DataAdapterExtender<T> : DataAdapter<T> where T : class { public T BaseAdapter; }
는 DAL에서 구현 :
// base interface defines methods
public interface IMyDataAdapter
{
string GetString();
}
// base sql adapter
public class SqlDataAdapter : DataAdapterBase<IMyDataAdapter>, IMyDataAdapter
{
public string GetString()
{
return "SQL";
}
}
// provides cache support
public class DistributedCacheExtender : DataAdapterExtender<IMyDataAdapter>, IMyDataAdapter
{
public string GetString()
{
return BaseAdapter.GetString() + ", Distributed Cache";
}
}
// provides local cache support
public class LocalCacheExtender : DataAdapterExtender<IMyDataAdapter>, IMyDataAdapter
{
public string GetString()
{
return BaseAdapter.GetString() + ", Local Cache";
}
}
데이터 액세스 :
public IMyDataAdapter GetAdapter()
{
// create adapter based on SqlDataAdapter
DataAdapterFactory<IMyDataAdapter> factory = new DataAdapterFactory<IMyDataAdapter>(new SqlDataAdapter());
// implement distributed cache
factory.Extend<DistributedCacheExtender>();
// implement local cache
factory.Extend<LocalCacheExtender>();
return factory.GetAdapter();
}
사용 위의 팩토리, 기본 어댑터 및 Extender (확장 순서 <()를 실행 순서대로 호출해야 함)를 인터페이스를 통해 즉석에서 원활하게 사용할 수 있습니다. 비즈니스 계층은 구현에 대해 아무 것도 모릅니다.
위의 경우 GetString()을 호출하면 "SQL, 분산 캐시, 로컬 캐시"가됩니다. 실제 시나리오에서는 로컬 캐시가 먼저 호출됩니다. 항목이 없으면 분산 캐시로 넘어 가고 거기에 없으면 DB에서 가져옵니다. 모든 모듈은 obejct에 따라 필요할 때마다 바꿀 수 있습니다. , 사용자 등
확실히 옵션입니다. 당신이 새로운 '데코레이터'를 구현할 때마다 생성자를 작성해야 할 필요성이 있었지만, 나는 방금 nitpicky가 될 수 있습니다 ... – Andrew
이 접근법은 상속에 비해 컴포지션을 선호하며 의존성 주입을 사용하면 잘 작동합니다. –