将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
                });
            }
        }
    }

将2个函数改为1个函数

我将引入一个包含您需要调用的方法的新接口,并使其他接口实现它。(注意,我不得不猜测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
                });
            }
        }
    }