我有两个相似的功能。唯一的区别是他们使用两种不同的模型。有一种方法可以动态初始化将要使用的类。
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
});
}
}
}
答案 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
});
}
}
}