小编bor*_*ris的帖子

.NET Core DI,将参数传递给构造函数的方法

拥有以下服务构造函数

public class Service : IService
{
     public Service(IOtherService service1, IAnotherOne service2, string arg)
     {

     }
}
Run Code Online (Sandbox Code Playgroud)

使用.NET Core IOC机制传递参数有哪些选择?

_serviceCollection.AddSingleton<IOtherService , OtherService>();
_serviceCollection.AddSingleton<IAnotherOne , AnotherOne>();
_serviceCollection.AddSingleton<IService>(x=>new Service( _serviceCollection.BuildServiceProvider().GetService<IOtherService>(), _serviceCollection.BuildServiceProvider().GetService<IAnotherOne >(), "" ));
Run Code Online (Sandbox Code Playgroud)

还有其他方法吗?

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

52
推荐指数
4
解决办法
2万
查看次数

洋葱建筑与六角形相比

它们之间有什么区别(洋葱|六角形),从我的理解它们是相同的,它们关注的是应用程序核心的领域,应该是技术/框架不可知的.

它们之间有什么区别?

另外我认为使用一个优于另一个甚至是针对N层架构没有真正的优势,如果做得不好只是跟随其中任何一个都没有任何区别

使用一个优于另一个以及为什么要使用它有什么好处?什么时候用?

谢谢

architecture software-design hexagonal-architecture onion-architecture

16
推荐指数
2
解决办法
5401
查看次数

迁移到.NET Core 3.0后出现问题

迁移到.NET Core 3.0之后。我在配置摇摇欲坠时遇到问题。

以下是我的配置。

  public void ConfigureServices(IServiceCollection services)
  {       

       services.AddMvc().SetCompatibilityVersion(Microsoft.AspNetCore.Mvc.CompatibilityVersion.Version_3_0).AddNewtonsoftJson();


       services.AddSwaggerGen(setup =>
       {
             setup.SwaggerDoc(
                "v1", 
                 new Info 
                 {  
                     Title = "Docker", 
                     Version = "v1" 
                 });
        });
  }

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
       Configuration.SwaggerOptions swaggerOptions = new Configuration.SwaggerOptions();

       _configuration.GetSection("SwaggerOptions").Bind(swaggerOptions);

       app.UseSwagger(options =>
       {
            options.RouteTemplate = swaggerOptions.JsonRoot;
       });

       app.UseSwaggerUI(options =>
       {
           options.SwaggerEndpoint(swaggerOptions.UiEndpoint, swaggerOptions.ApiDescription);
       });
}
Run Code Online (Sandbox Code Playgroud)

以下是例外

TypeLoadException:无法从程序集“ Microsoft.AspNetCore.Mvc.Formatters.Json”加载类型“ Microsoft.AspNetCore.Mvc.MvcJsonOptions”

有解决方案吗?

c# swagger asp.net-core asp.net-core-3.0 .net-core-3.0

7
推荐指数
1
解决办法
3628
查看次数

Automapper IMapper与依赖性解析器有关

我正在尝试使用automapper,并在尝试解析映射器对象时遇到一些问题.

这是代码

 public class MapAdapter : IMyMapper
 {
        private readonly AutoMapper.IMapper _mapper;

        public MapAdapter(AutoMapper.IMapper mapper)
        {
            _mapper = mapper;
        }

public TDest Map<TSource, TDest>(TSource source)
        {
            try
            {
                return _mapper.Map<TSource, TDest>(source);
            }
            catch (Exception exception)
            {
                throw;
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

这是例外

处理请求时发生未处理的异常.InvalidOperationException:尝试激活"Infrastructure.Mapper.Adapter.MapAdapter"时无法解析类型"AutoMapper.IMapper"的服务.

如果我从构造函数中删除AutoMapper.Mapper依赖项

public MapAdapter()
Run Code Online (Sandbox Code Playgroud)

一切都有效,除了Automapper _mapper字段,当然是null

这是DI配置,其中IMyMapper是我的界面,MapAdapter是IMyMapper的实现

_serviceCollection.AddTransient<IMyMapper, MapAdapter>();
Run Code Online (Sandbox Code Playgroud)

我有一个空的映射配置文件

  public class OrderDataMappingProfile : Profile
    {
        public OrderDataMappingProfile()
        {
        }
    }
Run Code Online (Sandbox Code Playgroud)

知道为什么失败了吗?

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

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

DDD设计理解

我一直在开始学习DDD,我有几个问题,这样我就可以提高对它的理解.

所以典型的DDD架构看起来像这样

Domain Layer =>此层应该是技术不可知的,应该包含以下内容

Domain.Entities(不同于持久层实体,应该只包含验证规则?任何其他域业务应该在这里吗?)

Domain.ValueObjects(域中不需要唯一的对象,应仅包含验证规则)

Domain.Services(该层应包含业务逻辑,虽然与Aggregate相关,但不适合Aggregate本身.协调器用于需要多个Domain.Entities和/或Domain.ValueObjects协同工作的操作)

Domain.Factories(这个层在某种程度上是不完全理解的,我的意思是它的责任是创建聚合或什么?)它纯粹是工厂设计模式还是与它不同?

Domain.Repositories(这个层也是模棱两可的,除了我知道这个层负责与外部服务通信,它应该处理什么类型的业务逻辑?)

反腐败层(该层应该充当域层和应用层之间的网关,它应该负责将响应和请求从一层转换到另一层)

Application Layer =>仅应用于以客户易于理解的格式公开数据.过滤在此层(Linq-To-SQL)/(Linq-To-Entity)中完成

客户端(最终层)=>应该没有任何逻辑,只暴露应用层服务提供的模型.

我看到的其他图层

Shared.Kernel(跨多个有界上下文共享的Domain.ValueObjects/Domain.Entites(不是AggregateRoots))

Infrastructure.Domain.Common(在整个域中共享,从AggregateRoot,BaseEntity,BaseValueObject等)

Infrastructure.DataAccess.Provider(示例EntityFramework/nHibernate/MongoDriver,该层应该与谁通信?应用层?

.net c# domain-driven-design ddd-repositories ddd-service

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

实体框架核心添加迁移失败

我正在尝试在我的项目中使用Ef Core。

就我不是在WebApi.csproj现场使用EfCore而言,结构有所不同。实际上,我有一个不同的dll。和一个DependenciesResolver.dll处理我所有的依赖项注入。

在我的EfCore.dll中,我已经安装了两个

Microsoft.EntityFrameworkCore.Tools

Microsoft.EntityFrameworkCore.SqlServer

现在,当我尝试运行命令时(我正在运行的dll是EfCore.dll)

Add-Migration Name
Run Code Online (Sandbox Code Playgroud)

我得到这个:

在类“ Program”上访问IWebHost时发生错误。没有应用程序服务提供商就继续进行。错误:对象引用未设置为对象的实例。无法创建“ StoreContext”类型的对象。将“ IDesignTimeDbContextFactory”的实现添加到项目中,或在设计时查看 https://go.microsoft.com/fwlink/?linkid=851728,以获取其他支持的模式。

sln的结构是这样的

WebApi | EfCore.dll | DependencyResolver.dll,我想保持这种方式,不想允许在我的WebApi中使用EfCore。

解决此问题的方法是什么?

如果在EfCore.dll中有帮助,我可以这样做。

 public sealed partial class StoreContext : DbContext, IStoreContext
    {
        private string _connectionString;

        public StoreContext(string connectionString) : base()
        {
            _connectionString = connectionString;

            Database.EnsureCreated();
        }

        /// db.tbls
        public DbSet<Order> Orders { get; set; }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.AddOrderConfiguration();
        }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer(_connectionString);
        }
    }
Run Code Online (Sandbox Code Playgroud)

像这样被DependencyResolver调用

        private DependenciesResolver RegisterInfrastructure()
        {
            _serviceCollection.AddScoped<StoreContext>(factory => …
Run Code Online (Sandbox Code Playgroud)

c# entity-framework-core .net-core asp.net-core-2.0 ef-core-2.1

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

我可以从查询中消除内部查询

我想知道我是否可以改进此查询:

SELECT _c.*,
       _o.Status,
      (SELECT TOP 1 _o.PlacedOn
         FROM Orders _o1
         JOIN Client _c1 on _c1.Id = _o1.Client_Id
        WHERE _c1.Id = 3
     ORDER BY PlacedOn DESC) as LastOrderDate
  FROM Client _c
  JOIN Orders _o on _c.[Id] = _o.[Client_Id]
 WHERE _c.Id = 3 AND _o.[Status] = 'Draft'
Run Code Online (Sandbox Code Playgroud)

需要外部JOIN才能从客户端获取信息以及有关他订单的一些信息.

内部JOIN获取该客户端的最后放置顺序.

我想知道我是否可以删除内连接以及如何删除.

           Client.tbl
Id              int
Gender          nvarchar(255)
DateOfBirth     nvarchar(255)
ContactDetails  nvarchar(MAX)
FirstName       nvarchar(255)
MiddleName      nvarchar(255)
LastName        nvarchar(255)


           Order.tbl
Id                int
Status            nvarchar(255)
PaymentMethod     nvarchar(255)
PlacedOn          datetime2(7)
CancelledOn       datetime2(7)
PaidOn            datetime2(7)
OrderNumber       nvarchar(255)
Client_Id …
Run Code Online (Sandbox Code Playgroud)

sql t-sql sql-server

0
推荐指数
1
解决办法
79
查看次数

具有不同执行时间的异步流

我有两个API,它们调用相同的服务。

该版本在最昂贵的任务花费的时间内执行。

public async Task<double> Do()
{
    var sw = System.Diagnostics.Stopwatch.StartNew();

    var t1 = _service.Do1();
    var t2 = _service.Do2();

    await t1;
    await t2;

    return sw.Elapsed.TotalMilliseconds;
}
Run Code Online (Sandbox Code Playgroud)

这是每个任务延迟的总和。

public async Task<double> Do()
{
   var sw = System.Diagnostics.Stopwatch.StartNew();

   await _service.Do1();
   await _service.Do2();

   return sw.Elapsed.TotalMilliseconds;
}

internal async Task Do1() => await Task.Delay(5000);
internal async Task Do2() => await Task.Delay(2000);
Run Code Online (Sandbox Code Playgroud)

为什么会这样,实际上是什么情况?

.net c# asynchronous async-await

0
推荐指数
1
解决办法
56
查看次数