我很难理解 Ioc 和泛型,尤其是我的公司如何设置与此相关的层。我们在 MVP 架构下工作。
我有一个汽车课:
class Car : ICar
{
IList<IWheel> wheels{get;set;}
IEngine engine{get;set;}
string registrationplate {get;set;}
public Car(){}
}
并且我希望能够获得一个新创建的 ICar,并且我还希望能够通过 Id 找到 ICar。问题是我不确定为什么在我正在进行的项目中做出了一些设计选择。已经创建的其他服务的结构如下:
我有汽车和车轮服务:
class WheelService : BaseService
{
IWheel wheel;
public IWheel Create()
{
return new wheel()
}
}
class CarService : BaseService
{
WheelService wheelservice;
public ICar CarCreate()
{
wheelservice = new Wheelservice()
car = new Car();
IWheel wheel = wheelservice.Create();
car.wheels.add(wheel);
return car;
}
public ICar Find(int id)
{
return (Car)base.Find<Car>(id);
}
}
首先,我发现“为每个实体提供服务”很奇怪。我不会想到一个弱实体会有服务。我的想法是 CarService create 方法将像工厂方法一样工作,而无需调用车轮服务。
此外,在演示者代码中实际上使用了轮服务创建方法,以将 IWheel 一直返回到 UI,以便可以设置值并向上传递。再一次,这对我来说似乎很奇怪。表示演示者可以从 UI 请求完整的 ICar 对象。Service create方法中的依赖是否正常?我原以为这将通过 IoC 引入。但是,如果 ICar Create 方法要处理所有创建(包括轮子等),那么大概容器将包含许多与此特定服务相关的接口?
如果我要引入接口,我需要调整 CarService.Find 方法,该方法目前正在使用具体类。它使用 BaseService,并且只有这一层与容器交互以获得正确的存储库:
class BaseService
{
private object myRepository;
protected T GetRepository<T>(Type serviceType)
{
if (myRepository == null)
{
myRepository = (T)IoCRepositoryFactory.GetRepositoryInstance(typeof(T), serviceType);
}
return (T)myRepository;
}
protected virtual IGenericRepository Repository
{
get
{
return GetRepository<IGenericRepository>(this.GetType());
}
}
protected virtual T Find<T>(Object id) where T : class
{
return (T)Repository.GetByID<T>(id);
}
}
如果我只使用接口,我不确定如何调用这个 find 方法,因为当前的服务定义正在使用具体的类。
抱歉,这是一个冗长的帖子。我已经查看了三天,但我需要知道其他人对当前设置的看法,以及我是否应该将 IOC 用于服务层中的域对象,或者我是否应该遵循当前设置。此刻对我来说,这一切都感觉有点耦合。