Я пишу управляемый данными клиент WPF. Клиент обычно извлекает данные из службы WCF, которая запрашивает базу данных SQL, но я бы хотел получить возможность извлекать данные непосредственно из SQL или других произвольных источников данных.
Я придумал этот дизайн и хотел бы услышать ваше мнение о том, является ли он лучшим дизайном.
Во-первых, у нас есть некоторый объект данных, который мы хотели бы извлечь из SQL.
// The Data Object with a single property
public class Customer
{
private string m_Name = string.Empty;
public string Name
{
get { return m_Name; }
set { m_Name = value;}
}
}
Тогда я планирую использовать интерфейс, который должны быть реализованы на всех уровнях доступа к данным. Предположим, можно также использовать абстрактный класс. Мысли?
// The interface with a single method
interface ICustomerFacade
{
List<Customer> GetAll();
}
Можно создать реализацию SQL.
// Sql Implementation
public class SqlCustomrFacade : ICustomerFacade
{
public List<Customer> GetAll()
{
// Query SQL db and return something useful
// ...
return new List<Customer>();
}
}
Мы также можем создать реализацию WCF. Проблема с WCF заключается в том, что он не использует один и тот же объект данных. Он создает свою собственную локальную версию, поэтому нам придется как-то скопировать детали. Я полагаю, можно использовать отражение, чтобы скопировать значения аналогичных полей через. Мысли?
// Wcf Implementation
public class WcfCustomrFacade : ICustomerFacade
{
public List<Customer> GetAll()
{
// Get date from the Wcf Service (not defined here)
List<WcfService.Customer> wcfCustomers = wcfService.GetAllCustomers();
// The list we're going to return
List<Customer> customers = new List<Customer>();
// This is horrible
foreach(WcfService.Customer wcfCustomer in wcfCustomers)
{
Customer customer = new Customer();
customer.Name = wcfCustomer.Name;
customers.Add(customer);
}
return customers;
}
}
Я также планирую использовать фабрику, чтобы решить, какой фасад использовать.
// Factory pattern
public class FacadeFactory()
{
public static ICustomerFacade CreateCustomerFacade()
{
// Determine the facade to use
if (ConfigurationManager.AppSettings["DAL"] == "Sql")
return new SqlCustomrFacade();
else
return new WcfCustomrFacade();
}
}
Так обычно используется DAL.
// Test application
public class MyApp
{
public static void Main()
{
ICustomerFacade cf = FacadeFactory.CreateCustomerFacade();
cf.GetAll();
}
}
Я ценю ваши мысли и время.