相关疑难解决方法(0)

使用DI和IoC的工厂方法

我熟悉这些模式,但仍然不知道如何处理以下情况:

public class CarFactory
{
     public CarFactory(Dep1,Dep2,Dep3,Dep4,Dep5,Dep6)
     {
     }

     public ICar CreateCar(type)
     {
            switch(type)
            {
               case A:
                   return new Car1(Dep1,Dep2,Dep3);
               break;

               case B:
                   return new Car2(Dep4,Dep5,Dep6);
               break;
            }
     }
}
Run Code Online (Sandbox Code Playgroud)

通常,问题在于需要注入的引用量.当有更多的汽车时会更糟.

我想到的第一种方法是在工厂构造函数中注入Car1和Car2,但它违反工厂方法,因为工厂将始终返回相同的对象.第二种方法是注入servicelocator,但它的反模式到处都是.怎么解决?

编辑:

替代方式1:

public class CarFactory
{
     public CarFactory(IContainer container)
     {
        _container = container;
     }

     public ICar CreateCar(type)
     {
            switch(type)
            {
               case A:
                   return _container.Resolve<ICar1>();
               break;

               case B:
                     return _container.Resolve<ICar2>();
               break;
            }
     }
}
Run Code Online (Sandbox Code Playgroud)

替代方式2(由于树中的依赖性过多而难以使用):

public class CarFactory
{
     public CarFactory()
     {
     }

     public ICar CreateCar(type)
     {
            switch(type)
            { …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection inversion-of-control factory-pattern

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

ASP.NET Core DI构造函数与RequestServices

为什么要通过HttpContext.RequestServicesIServiceProvider考虑不良做法请求服务.我可以在这个地方读到这句话:

建议使用构造函数注入而不是使用RequestServices获取它.


我的想法恰恰相反.尽可能使用RequestServices.让我解释一下原因.我想保持控制器尽可能小,所以我创建了单独的服务.这样,我的控制器很干净:

public class MyController : Controller
{
    public MyController(IMyServices MyServices){}

    public async Task<IActionResult> GetSomething(int parameter)
    {
       return await this.MyServices.SomeMethod(parameter);
    }
}
Run Code Online (Sandbox Code Playgroud)

所有服务都从base继承,其中包含用于管理权限的逻辑,缓存sql请求....
使用构造函数方法,我得到了非常复杂的调用库系统:

public class MyBaseService
{
    public MyBaseService(ILogger Logger, AppDbContext Context, IMemoryCache Cache) { }

    public bool HasRight(string right) { return true; }

    public bool IsLoggedIn() { return true; }
}

public class MyServices : MyBaseService
{
    public MyServices(ILogger Logger, AppDbContext Context, IMemoryCache Cache) : base(Logger, Context, Cache)
    {    
    }
}
Run Code Online (Sandbox Code Playgroud)

但随着GetRequiredService …

c# dependency-injection .net-core asp.net-core

4
推荐指数
1
解决办法
1355
查看次数