拥有以下服务构造函数
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
它们之间有什么区别(洋葱|六角形),从我的理解它们是相同的,它们关注的是应用程序核心的领域,应该是技术/框架不可知的.
它们之间有什么区别?
另外我认为使用一个优于另一个甚至是针对N层架构没有真正的优势,如果做得不好只是跟随其中任何一个都没有任何区别
使用一个优于另一个以及为什么要使用它有什么好处?什么时候用?
谢谢
architecture software-design hexagonal-architecture onion-architecture
迁移到.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”
有解决方案吗?
我正在尝试使用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)
知道为什么失败了吗?
我一直在开始学习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,该层应该与谁通信?应用层?
我正在尝试在我的项目中使用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
我想知道我是否可以改进此查询:
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) 我有两个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)
为什么会这样,实际上是什么情况?
c# ×6
.net ×3
.net-core ×3
asp.net-core ×2
architecture ×1
async-await ×1
asynchronous ×1
automapper ×1
ddd-service ×1
ef-core-2.1 ×1
sql ×1
sql-server ×1
swagger ×1
t-sql ×1