我有一个简单的业务经理外观,应该只保留一些库存信息。但是我不断收到“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);
}
}
答案 0 :(得分:3)
您使用的(InventorySvc).Name
与InventorySvc.Name
相同,因此可以访问InventorySvc
类的静态成员。因为它不是一个类而是一个接口,所以它不能有静态成员。
答案 1 :(得分:1)
InventorySvc invSvc = (InventorySvc)factory.GetService((InventorySvc).Name);
此代码应检索实现InventorySvc
的类型的实例。但是,看起来您正在尝试传递该类型的实例,这是没有意义的 - 语法错误,您还没有实例化该类型。据推测,您甚至不知道特定类型,只是界面类型。工厂和界面已经抽象了实现(通常是一件好事)。
在你的例子中,工厂可能希望将类型的名称作为字符串(我不会通过辩论,如果这是一件好事而不会使答案过于复杂)。作为回报,工厂将实例化一个实现InventorySvc
的实例并将其返回。只有这样才能调用实例成员,例如“Name”属性。
作为旁注,接口名称为should start with an I
in c#,例如IInventorySvc
。这使得您和任何读取代码的人都更加清楚它是一个接口。