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并返回它的实例。只有这样,您才能调用实例成员,例如“名称”属性。

附带说明一下,接口名称I以 c# 中的 a开头,例如IInventorySvc. 这使您和任何阅读您的代码的人都更清楚它是一个接口。

另见:https ://stackoverflow.com/a/681815/453277

于 2012-09-30T20:54:55.377 回答