我理解DI背后的概念,但我只是在学习不同的IoC容器可以做什么.似乎大多数人都主张使用IoC容器来连接无状态服务,但是如何将它们用于实体等有状态对象呢?
无论是对还是错,我通常会用行为填充我的实体,即使这种行为需要外部类.例:
public class Order : IOrder
{
private string _ShipAddress;
private IShipQuoter _ShipQuoter;
public Order(IOrderData OrderData, IShipQuoter ShipQuoter)
{
// OrderData comes from a repository and has the data needed
// to construct order
_ShipAddress = OrderData.ShipAddress; // etc.
_ShipQuoter = ShipQuoter;
}
private decimal GetShippingRate()
{
return _ShipQuoter.GetRate(this);
}
}
Run Code Online (Sandbox Code Playgroud)
如您所见,依赖项是Constructor Injected.现在提出几个问题.
让您的实体依赖于诸如ShipQuoter之类的外部类别是否被视为不良做法?如果我正确理解定义,消除这些依赖性似乎会导致我陷入贫血领域.
使用IoC容器来解决这些依赖关系并在需要时构建实体是不好的做法吗?是否有可能做到这一点?
感谢您的任何见解.
entities dependency-injection castle-windsor ioc-container inversion-of-control
我想知道如何在域驱动设计中实现工厂.(例子)
哪里应该放置工厂的接口和实现?我是否需要为工厂创建的Domain对象创建接口?我是否需要为存储库,服务创建工厂......
我正在使用依赖注入容器如何将它们与工厂放在一起?
谢谢.
我目前正在使用 DDD,我有一个关于应用程序服务 VS 域服务 VS 存储库接口的问题
我所知:
应用程序服务用于处理用例流,包括域之上所需的任何其他问题。
领域服务用于封装不适合单个领域对象的行为。
因此,考虑到以下用例:
“当您在系统中创建新的汽车实体(uuid,名称)时,汽车名称必须是唯一的(不再存在具有该名称的汽车),或者汽车名称不能包含数据库中的另一个汽车名称作为子字符串”,对于例如,这只是一个用例的示例,它迫使我在创建对象时查看存储库中的其他实体
所以问题是:我应该在哪里进行检查和/或注入存储库接口?
- 选择 1)在应用程序服务中,注入 RepositoryCarInterface,进行检查并保存 Car:
class CreateCarApplicationService
{
private carRepositoryInterface $carRepository;
public function __construct(CarRepositoryInterface $carRepository)
{
$this->carRepository = $carRepository;
}
public function __invoke(string $carUuid, string $carName): void
{
$this->ensureCarNameIsUnique($CarName);
$car = new Car($carUuid,$carName);
$this->carRepository->save($car);
}
private function ensureCarNameIsUnique(string $carName): void
{
$CarSameName = $this->carRepository->findOneByCriteria(['name' => $carName]);
if ($carSameName) {
throw ExceptionCarExists();
}
}
}
Run Code Online (Sandbox Code Playgroud)
- 选择 2)将此逻辑创建到域服务中(目的是使域逻辑靠近域对象)并从更简单的应用程序服务调用它,该服务最终负责保存与数据库交互的模型:
class CreateCarDomainService
{
private carRepositoryInterface $carRepository;
public function …Run Code Online (Sandbox Code Playgroud) 这些天我经常面临这种情况,我正在寻找一个优雅的解决方案。我有 :
public abstract class TypeA
{
public abstract void AbtractMethod(IDependency dependency);
}
public class TypeB : TypeA
{
public override void AbtractMethod(ISpecializedDependencyForB dependency) { }
}
public class TypeC : TypeA
{
public override void AbtractMethod(ISpecializedDependencyForC dependency) { }
}
public interface IDependency { }
public interface ISpecializedDependencyForB : IDependency { }
public interface ISpecializedDependencyForC : IDependency { }
Run Code Online (Sandbox Code Playgroud)
我的目标是在客户端的角度使事情变得透明,并像这样使用这段代码:
TypeA myDomainObject = database.TypeARepository.GetById(id); // The important point here is that I don't know if the object is of …Run Code Online (Sandbox Code Playgroud) 我正在使用MVVM灯和它的Ioc做一个wpf应用程序SimpleIoc.
我实现了这样的存储库模式:
public interface ICrud<T> where T : class
{
IEnumerable<T> GetAll();
Task<IEnumerable<T>> AsyncGetAll();
void AddNew(params T[] items);
void Delete(params T[] items);
void Update(params T[] items);
void SaveOrUpdate(params T[] items);
}
public class Crud<T> : ICrud<T> where T : class
{
public void AddNew(params T[] items)
{
using (var context = new DataEntities())
{
foreach (T item in items)
{
context.Entry(item).State = System.Data.Entity.EntityState.Added;
}
context.SaveChanges();
}
}
public void Delete(params T[] items)
{
using (var context = new …Run Code Online (Sandbox Code Playgroud)