gpt4 book ai didi

asp.net-mvc-3 - 存储库模式和Azure表存储(???)

转载 作者:行者123 更新时间:2023-12-02 06:14:23 25 4
gpt4 key购买 nike

在做下面这个简单的例子时,我发现了以下困难正如标题所示,我打算在 Azure 表存储中存储数据时使用存储库模式。现在我有几个类:Repository.cs、IRepository.cs、DataContext.cs 和 Controller。

在阅读过程中,我找到了一些信息并做了如下操作。IRepository.cs

public interface IRepository<T> where T: TableServiceEntity
{

T GetById(int Id);

IQueryable<T> GetAll();

}

和 DataContext.cs

public class DataContext<T>:TableServiceContext where T:TableServiceEntity
{


public DataContext(CloudStorageAccount storageaccount, StorageCredentials credentials)
: base(storageaccount.TableEndpoint.AbsoluteUri, credentials)
{
// _storageAccount = storageaccount;

var storageAccount = CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue(KEY_STORAGE));
storageAccount.CreateCloudTableClient().CreateTableIfNotExist(tableName);


}

public IQueryable<T> DeviceTable
{
get { return CreateQuery<T>(tableName); }
}


}

加上 Controller 的某些部分(我之前创建的表中已经有数据)

public class DeviceMeController : Controller
{

private IRepository<Entity>_repository;

public Controller() : this(new Repository<Entity>())
{
}
public Controller(IRepository<Entity> repository)
{
_repository = repository;
}
public ActionResult Index()
{
var List = _repository.GetAll();

return View(deviceList);
}

以及接口(interface)Repository.cs的实现,这里是我遇到错误并且迷路的地方

 public class Repository<T>:IRepository<T> where T:TableServiceEntity
{
private DataContext<T> _serviceContext;
// here get tablename as pararameter;
// so the Enities call this function
public Repository()
{

// the same context for multiple tables ?
}
// perhaps it should take the table Name
public void Add(T item)
{

_serviceContext.AddObject(TableName,item);
_serviceContext.SaveChangesWithRetries();
}
public IQueryable<T> GetAll()
{
var results = from c in _serviceContext.Table
select c;

return results;

错误与空引用有关,调试器显示变量结果为空?

最后我需要了解一些事情。

我应该在 Repository.cs 构造函数中做什么?我相信 Datacontext.cs 类必须位于一个单独的类中......

这里有任何提示

最佳答案

嘿,

首先,我认为您遗漏了一些代码,因为我不知道您如何在存储库中获取上下文。但是假设您确实正确设置了它(注入(inject)?),考虑到您设计数据上下文的方式,存储库不需要知道表名称,因为它是在以下代码行中设置的:

 public IQueryable<T> DeviceTable 
{
get { return CreateQuery<T>(Constants.DeviceTableName); }
}

因此,当您基于 IQueryable DeviceTable 创建查询时,表名称已设置。

问题是我认为不需要您的上下文类,特别是因为它只能带来单个实体类型(它是通用的并且基于实体)。我的 Azure 表存储存储库的基本布局是:

public abstract class CloudRepository<TEntity> : ICloudRepository<TEntity>
{
private TableServiceContext _tableServiceContext;
private string _tableName;

public string TableName
{
get { return _tableName ?? ( _tableName = typeof(TEntity).Name.Replace("Entity", string.Empty).ToLower()); }
}

public CloudStorageAccount StorageAccount
{
get
{
return CloudStorageAccount.Parse(RoleEnvironment.GetConfigurationSettingValue("StorageConnectionString"));
}
}

public CloudTableClient TableClient
{
get
{
CloudTableClient cloudTableClient = StorageAccount.CreateCloudTableClient();
cloudTableClient.CreateTableIfNotExist(TableName);
return cloudTableClient;
}
}

public TableServiceContext ServiceContext
{
get
{
return _tableServiceContext ?? (_tableServiceContext = TableClient.GetDataServiceContext());
}
}

public IEnumerable<TEntity> FindAll()
{
return ServiceContext.CreateQuery<TEntity>(TableName).ToList();
}

}

希望这对您有帮助。

关于asp.net-mvc-3 - 存储库模式和Azure表存储(???),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11115747/

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