相关疑难解决方法(0)

为什么不使用IoC容器来解析实体/业务对象的依赖关系?

我理解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.现在提出几个问题.

  1. 让您的实体依赖于诸如ShipQuoter之类的外部类别是否被视为不良做法?如果我正确理解定义,消除这些依赖性似乎会导致我陷入贫血领域.

  2. 使用IoC容器来解决这些依赖关系并在需要时构建实体是不好的做法吗?是否有可能做到这一点?

感谢您的任何见解.

entities dependency-injection castle-windsor ioc-container inversion-of-control

77
推荐指数
1
解决办法
9120
查看次数

DDD - 如何实施工厂

我想知道如何在域驱动设计中实现工厂.(例子)

哪里应该放置工厂的接口和实现?我是否需要为工厂创建的Domain对象创建接口?我是否需要为存储库,服务创建工厂......

我正在使用依赖注入容器如何将它们与工厂放在一起?

谢谢.

domain-driven-design factories

6
推荐指数
1
解决办法
2022
查看次数

DDD 在域服务上注入存储库 VS 在应用程序服务上编排流程

我目前正在使用 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)

domain-driven-design dependency-injection repository

5
推荐指数
1
解决办法
1328
查看次数

多态和依赖注入

这些天我经常面临这种情况,我正在寻找一个优雅的解决方案。我有 :

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)

c# oop polymorphism dependency-injection unity-container

3
推荐指数
2
解决办法
3277
查看次数

依赖注入和实体框架

我正在使用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)

c# wpf entity-framework dependency-injection mvvm

2
推荐指数
1
解决办法
2072
查看次数