4

次の簡単な例を実行しているときに、次の問題が見つかりました。タイトルにあるように、Azureテーブルストレージにデータを格納するときにリポジトリパターンを使用するつもりです。現在、Repository.cs、IRepository.csの2つのクラスがあります。 、DataContext.csおよびコントローラー。

私の読書中に私はいくつかの情報を見つけ、次のようにやっています。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); }
   }


}

加えて、コントローラーの一部(以前に作成したテーブルにすでにデータがあります)

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

インターフェースReposistory.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;

エラーはnull参照に関するものです。デバッガーは、変数の結果がnullであることを示していますか?

結局、私はいくつかのことを知る必要があります。

Repository.csコンストラクターで何をすべきですか?Datacontext.csクラスは別のクラスになければならないと思います...

ここにヒント

4

1 に答える 1

5

やあ、

まず、リポジトリでコンテキストを取得する方法がわからないため、コードを省略したと思います。ただし、データコンテキストの設計方法を考慮して、正しく設定したとすると(インジェクション?)、次のコード行で設定されているため、リポジトリはテーブル名を知る必要はありません。

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

したがって、IQueryable DeviceTableに基づいてクエリを作成する場合、テーブル名はすでに設定されています。

特に、単一のエンティティタイプ(汎用でエンティティに基づく)しか引き継ぐことができないため、コンテキストクラスの必要性はわかりません。AzureTableStorageのリポジトリの基本的なレイアウトは次のとおりです。

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

}

これがお役に立てば幸いです。

于 2012-06-21T07:09:59.787 に答える