Actualmente estoy creando una interfaz web para FreeRADIUS. Es solo una aplicación pequeña, para simplificar las mutaciones de los compañeros perezosos de Shell y SQL. Creé un modelo de Entity Framework para la base de datos y quiero encapsularlo usando el patrón de fachada. Así que creé una clase de DTO llamada Cuenta. Almacena datos agregados de tres tablas diferentes. Esto es lo que parece Account.cs:Permanezca SECO con DTO
public class Account
{
public int? Id { get; set; }
public string UserName { get; set; }
public string Password { get; set; }
public string GroupName { get; set; }
public string IpAddress { get; set; }
public string Route { get; set; }
}
Este es el método que ensamblo y devuelvo una cuenta-DTO única.
Account Get(string userName)
{
// Get the values from the database.
var check = _entities.Checks.Single(x => x.UserName == userName);
var userGroup = _entities.UserGroups.Single(x => x.UserName == userName);
var ipReply = _entities.Replies.Single(x => x.UserName == userName && x.Attribute == "Framed-IP-Address");
var routeReply = _entities.Replies.Single(x => x.UserName == userName && x.Attribute == "Framed-Route");
// Populate the DTO
var account = new Account
{
UserName = check.UserName,
Password = check.Value,
GroupName = userGroup.GroupName
};
if (ipReply != null) account.IpAddress = ipReply.Value;
if (routeReply != null) account.Route = routeReply.Value;
return account;
}
Y este es el método para actualizar la base de datos por un usuario envía Cuenta-DTO
void Update(Account account)
{
// Get the values from the database. Again.
var check = _entities.Checks.Single(x => x.UserName == account.UserName);
var userGroup = _entities.UserGroups.Single(x => x.UserName == account.UserName);
var ipReply = _entities.Replies.Single(x => x.UserName == account.UserName && x.Attribute == "Framed-IP-Address");
var routeReply = _entities.Replies.Single(x => x.UserName == account.UserName && x.Attribute == "Framed-Route");
// Update the possible attributes
check.Value = account.Password;
userGroup.GroupName = account.GroupName;
ipReply.Value = account.IpAddress;
routeReply.Value = account.Route;
_entities.SaveChanges();
}
Como se puede ver, yo uso el mismo código para recuperar datos de la base de datos. ¿Cómo puedo SECAR este código?
'Fábrica :: GetCheck (cadena usuario)', 'Fábrica :: GetUserGroup (cadena usuario)', ...? –
¿Cuán profundo viaja a través de sus capas este DTO? ¿Va desde la capa UI hasta la capa DB? –
Es una aplicación web MVC (cada vista tiene un modelo de vista) El DTO se llena con dicho modelo de vista (en este caso, se parece a Account.cs) y se transfiere a la fachada (que contiene los métodos anteriores). – Sandro