1

asp.net クライアントがビジネス プロジェクトの dll を使用してビジネスを使用する既存の Web アプリケーションがあります。ビジネス プロジェクトのコードを以下に示します。

次に、それを WCF Web サービスとして作成する必要があります。既存のクラス BankAccountService からサービス インターフェイス (コントラクト) を作成する必要があります。しかし、クラスにはオーバーロードされたコンストラクターがあります。このコンストラクターは、サービス インターフェイスで定義できません (Web サービスはオブジェクト指向ではないため)。ここで Web サービスとして機能させるために使用できる最適なソリューションは何ですか?

サービス実装として BankAccountService を作成するのではなく、何らかのファサードを作成する必要がありますか?

注: サービスの実装後にインターフェイスを抽出するのは適切ではないことを理解しています。しかし、この特別なシナリオでは、これを行う必要があります。

注: これは非常に単純なアプリケーションであり、アプリケーションで必要な機能はこれだけです。Web サイトは、サービスを使用する唯一のクライアントになります。

参照:

1 コンストラクターの署名を定義するインターフェイス?

コード

namespace ApplicationServiceForBank
{

public class BankAccountService
{

RepositoryLayer.IRepository<RepositoryLayer.BankAccount> accountRepository;
ApplicationServiceForBank.IBankAccountFactory bankFactory;

public BankAccountService(RepositoryLayer.IRepository<RepositoryLayer.BankAccount> repo, IBankAccountFactory bankFact)
{
    accountRepository = repo;
    bankFactory = bankFact;
}

public void FreezeAllAccountsForUser(int userId)
{
    IEnumerable<RepositoryLayer.BankAccount> accountsForUser = accountRepository.FindAll(p => p.BankUser.UserID == userId);
    foreach (RepositoryLayer.BankAccount repositroyAccount in accountsForUser)
    {
        DomainObjectsForBank.IBankAccount acc = null;
        acc = bankFactory.CreateAccount(repositroyAccount);
        if (acc != null)
        {
            acc.BankAccountID = repositroyAccount.BankAccountID;
            acc.accountRepository = this.accountRepository;
            acc.FreezeAccount();
        }
    }
  }
}
4

1 に答える 1

1

クラスを WCF サービスとして公開する場合は、サービス自体がコンストラクターで必要なオブジェクトを構築する必要がRepositoryLayer.IRepository<RepositoryLayer.BankAccount>あり ますApplicationServiceForBank.IBankAccountFactory。これらは、サービスのコンシューマが不可知である必要があるデータを取得するために使用されるオブジェクトです。

この場合、BankAccountServiceWCF を介して公開し、データの取得に必要なリポジトリ/ファクトリのタイプを定義するさまざまなメソッドを作成できます。

[ServiceContract]
public interface IBankAccountService
{
    [OperationContract]
    void FreezeAllAccountsForUserByAccountTypeFoo(int userId);

    [OperationContract]
    void FreezeAllAccountsForUserByAccountTypeBar(int userId);

    [OperationContract]
    void FreezeAllAccountsForUserByAccountTypeEtc(int userId);
}

サービスの両側を制御しているように聞こえるので、別のオプションは、必要なリポジトリ/ファクトリのタイプを定義する列挙型をメソッドに渡すことです。

public enum RepoFactory
{
    Foo, Bar, Etc,
}

[ServiceContract]
public interface IBankAccountService
{
    [OperationContract]
    void FreezeAllAccountsForUser(int userId, RepoFactory repoFactory);
}
于 2012-06-27T15:48:11.183 に答える