gpt4 book ai didi

c# - 基于类型变量实例化不同存储库的策略模式

转载 作者:太空宇宙 更新时间:2023-11-03 11:29:30 25 4
gpt4 key购买 nike

我正在从事一个 wiki 项目。 MVC3 + EF4 代码优先。

我模型中的所有类都继承自主“EditBase”类。这确保它们都具有 ID、用户名和创建日期。它还帮助我为基本 CRUD 创建一个通用存储库。

我希望定义一个名为 AbuseReport 的新实体来处理不正确/不准确内容的标记:

public class AbuseReport : EditBase
{
public DateTime DateReported { get; set; }
public string EntityType { get; set; }
public int EntityId { get; set; }
public int ReportTypeId { get; set; }
public ReportType ReportType
{
get { return (ReportType) this.ReportTypeId; }
set { this.ReportTypeId = (int) value; }
}
public string Description { get; set; }
}

从 AbuseReport 对象的信息开始检索存储在数据库中的实体的最简单方法是什么?我不能使用外键,因为报告可以引用项目中的任何实体。

我需要这样调用:

Type modelType;
entityDictionary.TryGetValue(entityName, out modelType);
var rep = new Repository<modelType>();

最佳答案

我会将所有模型类型存储在同一个存储库中。存储库 key 必须包含模型的类型及其 ID。为此,我使用本地类 RepositoryKey:

public class EditBase
{
public int ID { get; set; }
public string Username { get; set; }
public DateTime CreatedDate { get; set; }
}

public class Repository
{
private Dictionary<RepositoryKey, EditBase> _store = new Dictionary<RepositoryKey, EditBase>();

public void Add(EditBase model)
{
_store.Add(new RepositoryKey(model), model);
}

public void Remove(EditBase model)
{
_store.Remove(new RepositoryKey(model));
}

public void Remove<T>(int id)
where T : EditBase
{
_store.Remove(new RepositoryKey(typeof(T), id));
}

public bool TryGet<T>(int id, out T value)
where T : EditBase
{
EditBase editBase;
if (!_store.TryGetValue(new RepositoryKey(typeof(T), id), out editBase)) {
value = null;
return false;
}
value = (T)editBase;
return true;
}

private class RepositoryKey : IEquatable<RepositoryKey>
{
private Type _modelType;
private int _id;

public RepositoryKey(EditBase model)
{
_modelType = model.GetType();
_id = model.ID;
}

public RepositoryKey(Type modelType, int id)
{
_modelType = modelType;
_id = id;
}

#region IEquatable<IdentityKey> Members

public bool Equals(RepositoryKey other)
{
if (_modelType != other._modelType) {
return false;
}
return _id == other._id;
}

#endregion

public override int GetHashCode()
{
return _modelType.GetHashCode() ^ _id.GetHashCode();
}
}
}

关于c# - 基于类型变量实例化不同存储库的策略模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8313935/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com