0

私は unity と unit of work パターンの初心者で、Web サービスに接続してすべての作業を行うコードを作成しようとしています。データベースを使用するまではすべてうまくいきますが、Web サービスを使用しようとすると迷います。

関連する可能性のあるすべての記事を検索してコードに適用することで、貴重な 2 日間を無駄にしましたが、今日まで運がありません。

接続文字列を web.config に書き込んで dbcontext クラス コントローラーで呼び出すと、必要なデータベースに接続されることはわかっていますが、どのデータベースにも接続していないため、web/app.config でどのような変更を行う必要がありますか。また、接続ロジックを dbcontext コンストラクターで記述しても、dbcontext を検索して SQL サーバーの詳細を入力します。DBSetを使用しているため、それが起こっていると思います。

みんな、あなたは私のコードを見てもらうように求められています. 見たいコードに関連する他の情報が必要な場合は、お知らせください。

ありがとう

 DBCONTEXT

 public class CVSContext :  DbContext
 {
    public DbSet<CVSViewModel> CVS { get; set; }
    public DbSet<Contact> Contacts { get; set; }
    public DbSet<Account> Accounts { get; set; }

    public CVSContext()
    {
        //CRM Start
            var clientCredentials = new System.ServiceModel.Description.ClientCredentials();
            clientCredentials.UserName.UserName = "";
            clientCredentials.UserName.Password = "";
            var serviceProxy = new Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy(new Uri("http://Organization.svc"), null, clientCredentials, null);
            serviceProxy.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
            HttpContext.Current.Session.Add("ServiceProxy", serviceProxy);
          //CRM End
    }
 }

汎用リポジトリ

   public class GenericRepository<TEntity> where TEntity : class
   {
    internal CVSContext context;
    internal DbSet<TEntity> dbSet;

    public GenericRepository(CVSContext context)
    {
        this.context = context;
        this.dbSet = context.Set<TEntity>();
    }
   }

作業単位

   public interface IUnitOfWork : IDisposable
{
    int SaveChanges();
}

public interface IDALContext : IUnitOfWork
{
    ICVSRepository CVS { get; set; }

    IContactRepository Contacts { get; set; }

    //IAccountRepository Accounts { get; set; }
}

public class DALContext : IDALContext
{
    private CVSContext dbContext;
    private ICVSRepository cvs;
    private IContactRepository contacts;
   // private IAccountRepository accounts;

    public DALContext()
    {
        dbContext = new CVSContext();
    }

    public ICVSRepository CVS
    {
        get
        {
            if (cvs == null)
                cvs = new CVSRepository(dbContext);
            return cvs;
        }

        set
        {
            if (cvs == value)
                cvs = value;
        }
    }

    public IContactRepository Contacts
    {
        get
        {
            if (contacts == null)
                contacts = new ContactRepository(dbContext);
            return contacts;
        }

        set
        {
            if (contacts == value)
                contacts = value;
        }
    }

    public int SaveChanges()
    {
        return this.SaveChanges();
    }

    public void Dispose()
    {
        if(contacts != null)
            contacts.Dispose();
        //if(accounts != null)
        //    accounts.Dispose();
        if(dbContext != null)
            dbContext.Dispose();

        GC.SuppressFinalize(this);
    }
  }

サービス

 public interface ICVSService
{
    Contact CreateContact(Guid contactName, string productName, int price);

    List<CVSViewModel> GetCVS();
    List<Contact> GetContacts();
    List<Account> GetAccounts();
}

public class CVSService : ICVSService, IDisposable
{
    private IDALContext context;

    public CVSService(IDALContext dal)
    {
        context = dal;
    }

    public List<CVSViewModel> GetCVS()
    {
        return context.CVS.All().ToList();
    }

    public List<Contact> GetContacts()
    {
        return context.Contacts.All().ToList();
    }

    public List<Account> GetAccounts()
    {
        return context.Accounts.All().ToList();
    }

    public Contact CreateContact(Guid contactName, string accountName, int price)
    {
        var contact = new Contact() { ContactId = contactName };

        var account = new Account() { ContactName = accountName,  Rent  = price, Contact = contact };

        //context.Contacts.Create(contact);
        context.SaveChanges();

        return contact;
    }

    public void Dispose()
    {
        if (context != null)
            context.Dispose();
    }
}    

コントローラ

  public ActionResult Index()
    {         
        ViewData.Model = service.GetContacts();
        return View();
    }
4

1 に答える 1

0

適切な抽象化がすべてです。一部のデータ ソース (db または ws の可能性があります) 間で使用される一般的な抽象化は、リポジトリ パターン、またはより高いレベルで Unit of Work パターンです。実際、Entity FrameworkDbContextは Unit of Work パターンの実装ですが、データベース用に調整されています。Web サービスとの通信には使用できません。

その場合、独自のIRepository<T>抽象化を記述し、カバーの下で を使用するデータベース固有の実装とDbContext、カバーの下で Web サービス クライアント プロキシをラップする Web サービス固有の実装を用意する必要があります。

ただし、アプリケーションがより複雑になると、ある種のトランザクションのような動作が必要になることがよくあります。これが、ビジネス トランザクションを提示する場合の Unit of Work パターンです。ただし、作業単位パターンを使用して複数の WS 呼び出しをラップすると、すぐに面倒になります。それを正しく行うには多くの作業が必要です。その場合、メッセージ ベースのアーキテクチャを使用する方がはるかに優れています。

メッセージ ベースのアーキテクチャでは、単一のアトミック オペレーション (ビジネス トランザクションまたはユース ケース) を特定のメッセージとして定義します。たとえば、次のようになります。

public class MoveCustomerCommand
{
    public int CustomerId { get; set; }

    public Address NewAddress { get; set; }
}

これは一連のプロパティを持つ単なるオブジェクト (DTO) ですが、動作はありません。これの良いところは、WCF やその他のテクノロジを使用してこれらの種類のオブジェクトをネットワーク経由で渡したり、消費者に知られることなくローカルで処理したりできることです。

詳しくはこちらの記事をご覧ください。この記事はそのモデルに基づいて構築されており、このモデルを使用して保守性の高い WCF サービスを作成する方法について説明します。

于 2013-04-22T08:10:39.563 に答える