Attualmente sto lavorando al refactoring del codice base per uno dei nostri servizi. Sto rivedendo tutto e sento che è un po 'dispersivo, e probabilmente potrei aderire ai principi OOP meglio.
Ho tre classi che sono tutte derivate da un'altra classe Cache
. Tutte e tre queste classi eseguono esattamente le stesse operazioni, l'unica differenza è il tipo di oggetto su cui stanno interrogando e il metodo utilizzato per interrogarle. Quale sarebbe il metodo migliore per rendere queste classi ancora più semplici?
public static class ZenDeskCache
{
public static ZendeskApi Api = new ZendeskApi(GlobalVariables.ZendeskUrl, GlobalVariables.ZendeskUser,
GlobalVariables.ZendeskPass);
public class Users : Cache<Users, List<User>>
{
protected override List<User> GetData()
{
var users = Api.Users.GetAllUsers();
var allUsers = new List<User>(users.Users);
while (users.NextPage != null)
{
users = Api.Users.GetByPageUrl<GroupUserResponse>(users.NextPage);
allUsers.AddRange(new List<User>(users.Users));
}
allUsers = allUsers.OrderBy(n => n.Name).ToList();
return allUsers;
}
protected override TimeSpan GetLifetime()
{
return TimeSpan.FromDays(1);
}
}
public class Organizations : Cache<Organizations, List<Organization>>
{
protected override List<Organization> GetData()
{
var organizations = Api.Organizations.GetOrganizations();
var allOrgs = new List<Organization>(organizations.Organizations);
while (organizations.NextPage != null)
{
organizations = Api.Users.GetByPageUrl<GroupOrganizationResponse>(organizations.NextPage);
allOrgs.AddRange(new List<Organization>(organizations.Organizations));
}
allOrgs = allOrgs.OrderBy(n => n.Name).ToList();
return allOrgs;
}
protected override TimeSpan GetLifetime()
{
return TimeSpan.FromDays(1);
}
}
public class Groups : Cache<Groups, List<Group>>
{
protected override List<Group> GetData()
{
var groups = Api.Groups.GetGroups();
var allGroups = new List<Group>(groups.Groups);
while (groups.NextPage != null)
{
groups = Api.Groups.GetByPageUrl<MultipleGroupResponse>(groups.NextPage);
allGroups.AddRange(new List<Group>(groups.Groups));
}
allGroups = allGroups.OrderBy(n => n.Name).ToList();
return allGroups;
}
protected override TimeSpan GetLifetime()
{
return TimeSpan.FromSeconds(600);
}
}
}