1

いくつかの在庫情報を保持するだけの単純なビジネス マネージャー ファサードがあります。ただし、「Home.Services.InventorySvc」は変数として使用されている型であるというエラーが表示され続けます。

私のファサードコード。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Home.Domain;
using Home.Services;

namespace Home.Business
{
    public class InventoryMngr
    {
        public void Create(CreateInventory inv) 
        {
            Factory factory = Factory.GetInstance();
            InventorySvc invSvc =
            (InventorySvc)factory.GetService(
            (InventorySvc).Name);
            invSvc.CreateInventory(inv);
        }
    }
} 

InventorySvc コード

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Home;
using Home.Domain;

namespace Home.Services
{
    public interface InventorySvc : IService
    {
        void CreateInventory(CreateInventory createinventory);
    }
}
4

2 に答える 2

3

(InventorySvc).Namewhich は と同じものを使用しているため、クラスInventorySvc.Nameの静的メンバーにアクセスすることになります。InventorySvcクラスではなくインターフェースであるため、静的メンバーを持つことはできません。

于 2012-09-30T20:51:43.600 に答える
1
InventorySvc invSvc = (InventorySvc)factory.GetService((InventorySvc).Name);

このコードは、 を実装する型のインスタンスを取得する必要がありますInventorySvcただし、型のインスタンスを渡そうとしているようですが、意味がありません。構文が間違っていて、まだ型をインスタンス化していません。おそらく、あなたはまだ特定の型さえ知らず、インターフェイスの型だけを知っているでしょう。ファクトリとインターフェイスは実装を抽象化しています (通常は良いことです)。

あなたの例では、ファクトリはおそらく型の名前を文字列として期待しています(それが良いことかどうかを議論して答えを複雑にしすぎません)。その見返りに、ファクトリはそれを実装して返すインスタンスをインスタンス化しますInventorySvc。そうして初めて、"Name" プロパティなどのインスタンス メンバーを呼び出すことができます。

補足として、インターフェイス名はc#で始まる必要がありIます(例: IInventorySvc. これにより、あなたとあなたのコードを読む人にとって、それがインターフェースであることがより明確になります。

参照: https://stackoverflow.com/a/681815/453277

于 2012-09-30T20:54:55.377 に答える