将2功能更改为一个功能

时间:2014-07-24 08:13:56

标签: c# linq

我有两个相似的功能。唯一的区别是他们使用两种不同的模型。有一种方法可以动态初始化将要使用的类。

 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 个答案:

答案 0 :(得分:3)

我将介绍一个新接口,其中包含您需要调用的方法,并使其他接口实现它。 (请注意,我必须猜测IQueryable的东西。)

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";
        }
    }
}

答案 1 :(得分:0)

可能存在这种可能性,您可以使用接受具有重叠属性的类型的泛型方法。

这是一个如何看起来像

的例子
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
                });
            }
        }
    }