将2个函数改为1个函数
本文关键字:函数 1个 2个 | 更新日期: 2023-09-27 18:14:27
我有两个类似的函数。唯一的区别是他们使用了两种不同的模型。是否有一种方法可以动态初始化将要使用的类。
ITagRepository tagRepo = new TagRepository();
ICategoryRepository catRepo = new CategoryRepository();
public void AddTagsDontExist(string tags)
{
var allTags = tagRepo.GetAllQueryAble();
string[] tag = tags.Split(',');
foreach (var item in tag)
{
if (allTags.Where(e => e.Name.Contains(item)).Count() == 0)
{
tagRepo.Add(new Tag
{
Name = item.ToString(),
DateAdded = DateTime.Now,
LastModifiedDate = DateTime.Now,
IsDeleted = false
});
}
}
}
public void AddCategoriesDontExist(string Categories)
{
var allCategory = catRepo.GetAllQueryAble();
string[] Category = Categories.Split(',');
foreach (var item in Category)
{
if (allCategory.Where(e => e.Name.Contains(item)).ToArray().Count() == 0)
{
catRepo.Add(new Category
{
Name = item.ToString(),
DateAdded = DateTime.Now,
LastModifiedDate = DateTime.Now,
IsDeleted = false
});
}
}
}
我将引入一个包含您需要调用的方法的新接口,并使其他接口实现它。(注意,我不得不猜测iquerable的东西)
interface IQueryable // My best guess at this. Substitute with the correct definition!
{
string Name { get; set; }
}
interface IRepository
{
IEnumerable<IQueryable> GetAllQueryAble();
void Add(string name, DateTime dateAdded, DateTime lastModifiedDate, bool isDeleted);
}
interface ITagRepository: IRepository
{
// ...
}
interface ICategoryRepository: IRepository
{
// ...
}
然后你可以像下面这样实现这个方法(我已经清理了一下):
public void AddItems(string items, IRepository repository)
{
var allTags = repository.GetAllQueryAble();
string[] tag = items.Split(',');
foreach (var item in tag)
{
if (!allTags.Any(e => e.Name.Contains(item)))
{
repository.Add
(
item,
DateTime.Now,
DateTime.Now,
false
);
}
}
}
如果你可以从其他方法中调用它,像这样:
public void AddTagsDontExist(string tags)
{
AddItems(tags, tagRepo);
}
public void AddCategoriesDontExist(string categories)
{
AddItems(categories, catRepo);
}
Add()
方法的实现看起来像这样(仅为ITagRepository实现显示的示例):
public sealed class TagRepository : IRepository
{
public string GetAllQueryAble()
{
return ""; // Replace with real implementation.
}
public void Add(string name, DateTime dateAdded, DateTime lastModifiedDate, bool isDeleted)
{
this.Add(new Tag(name, dateAdded, lastModifiedDate, isDeleted));
}
}
[编辑]考虑一下,您可能还需要为存储库中的项添加一个接口,以便您可以获得.Name
字段,但这将是一个类似的重构,使用与其他接口相同的方法,因此您应该能够从中推断。
这里有一个例子,我发明了一个新的IRepositoryItem
接口。注意Tag
类是如何实现它的:
interface IRepositoryItem
{
string Name { get; }
}
interface IRepository
{
IEnumerable<IRepositoryItem> GetAllQueryAble();
void Add(string name, DateTime dateAdded, DateTime lastModifiedDate, bool isDeleted);
}
interface ITagRepository: IRepository
{
// ...
}
interface ICategoryRepository: IRepository
{
// ...
}
public sealed class Tag: IRepositoryItem
{
public string Name
{
get
{
return "TODO: Implementation";
}
}
}
可能有这种可能性,您可以使用泛型方法来接受具有重叠属性的类型。
下面是
的示例public interface ICategoryOrTag
{
string Name {get; set;}
DateTime DateAdded {get; set;}
DateTime LastModifiedDate {get; set;}
bool IsDeleted {get; set;}
}
public class Category : ICategoryOrTag
{
//Category specific
}
public class Tag : ICategoryOrTag
{
//Tag specific
}
public void AddEntityDontExist<T>(string entities) where T : ICategoryOrTag, new()
{
var allEntities = entityRepo<T>.GetAllQueryAble();
string[] entity = entities.Split(',');
foreach (var item in entity)
{
if (allEntities.Where(e => e.Name.Contains(item)).ToArray().Count() == 0)
{
entityRepo.Add(new T
{
Name = item.ToString(),
DateAdded = DateTime.Now,
LastModifiedDate = DateTime.Now,
IsDeleted = false
});
}
}
}