小编The*_*hud的帖子

Winforms IOC容器 - 组合根

我最近和IOC Containers(在我的案例中是LightInject)有点讨厌.

我一直在读你应该只需要在启动时使用容器ONCE,而不是在其他地方.这是我难以理解的.如果我只能在引导程序/启动方法中引用容器,那么如何在课程依赖于用户输入的情况下,如何在项目中或在运行时解析我需要的内容.

所以在我的传统Windows窗体应用程序中,在Form Load Say上,我会根据下面的代码启动Lightinject.这只是一个随意的例子,它更像是我需要解决的前提.

我可能完全错过了这里的东西,或者只是没有得到它.但是我应该如何解决依赖性,如果我不能使用/不应该引用或使用Container.GetInstance/Resolve/{选择IOC语法Here},并且仅在组合根目录中.

对于Instance,我说我的表单上有两个按钮和一个TextBox.第一个按钮给我一个ILoader(下面的代码),第二个按钮加载一个文件查看器(ILoader,代码下面),其文件名是输入winform上文本框的内容.

没有IOC容器我会做以下(让我们假设它放在click事件中)

按钮1单击事件:

ISplitText MyStringFunc =  new WhateverImplementsIt();
Run Code Online (Sandbox Code Playgroud)

按钮2(根据文本框输入获取文件阅读器)

ILoader MyLoader = new FileReaderImplementation(TextBox1.Text);
Run Code Online (Sandbox Code Playgroud)

使用LightInject,我肯定不得不做以下事情:

Button1点击:

ISplitText Splitter = Container.GetInstance<ISplitText>();
Run Code Online (Sandbox Code Playgroud)

按钮2单击

var LoaderFunc = Container.GetInstance<Func<string, ILoader>>();
ILoader l2 = LoaderFunc(TextBox1.Text);            
Run Code Online (Sandbox Code Playgroud)

我不正确吗?在一个大型项目中,我将拥有Container.GetInstance,遍布整个地方,在主窗体文件和其他地方,所以我怎么能只在引导程序的形式中仅在1个位置引用容器,我错过了一个魔法一块拼图?

在所有示例应用程序中,我看到它都是在一个简单的控制台应用程序中,在Main函数中完成的.所有这些应用程序遵循以下格式:

Container = new Container();
Container.Register<IFoo,Foo>();
Container.Register<IBar,Bar();

var Resolved = Container.GetInstance<IFoo>();
Run Code Online (Sandbox Code Playgroud)

嗯,我理解这一切,而且非常简单.一旦你开始为应用程序本身添加一些复杂性,我就失去了如何获取实例而不使Container本身公开,静态,或以某种方式,形状或形式访问然后调用Container.GetInstance在一百万个地方(显然,这是一个很大的否定).请帮忙!干杯,

CHUD

PS - 我并不担心"抽象容器"本身.所以我宁愿只专注于增加我对上述的理解.

public class BootStrapIOC
{
    public ServiceContainer Container;
    public BootStrapIOC(ServiceContainer container)
    {
        Container = container;
    }

    public void Start()
    {
        Container.Register<ISplitText, StringUtil>();
        Container.Register<string, ILoader>((factory, value) => new …
Run Code Online (Sandbox Code Playgroud)

c# dependency-injection inversion-of-control light-inject

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

VSTS/Azure Devops自动增量包版本

运行.Net核心任务到打包.如何将输出的nuget包版本提供给Auto Increment本身,格式为:

1.0.0

所以下次我打包/推送时我想看1.0.1

我正在使用Build.BuildNumber的环境构建变量并在以下时刻获取输出:

20180913-.2.0等想要纠正更传统的版本控制系统

谢谢.

azure-devops azure-pipelines-build-task azure-pipelines azure-artifacts

7
推荐指数
3
解决办法
8493
查看次数

PackageReference 版本控制通配符 csproj

我的 NetStandard 项目中有以下内容

<ItemGroup>
<PackageReference Include="MyReference" Version="1.0.*" />
</ItemGroup>
Run Code Online (Sandbox Code Playgroud)

当我将它更改为使用通配符(而不是 1.0.1)时,我会在依赖项切换上看到一个感叹号,然后是 NuGet 切换,当然还有包本身。

当我签入时,CI 构建也在另一端失败,给我

无法找到包 MyReference。源中不存在具有此 ID 的包:Microsoft Visual Studio 离线包,nuget.org

使用没有通配符的实际版本 (1.0.1) 时,上述所有问题都会消失,但我想确保 .NET Core 还原任务始终还原到最新包,我希望一个简单的通配符可以做到.

注意 - 我正在使用我自己的私有 NuGet 存储库(包管理扩展)

请指教。

为什么在 CI 构建期间使用通配符会失败,表明它找不到包?

因此,假设我已将 project1 部署到我自己的 NuGet 存储库。Project2 依赖于 Project1,它已作为 NuGet 包添加到 Project2。Project1 包驻留在我自己的存储库中,没有问题也没有错误。

当我使用通配符并在本地构建时,它可以工作并恢复最新版本。当我签入代码更改(在 .csproj 中保留通配符)时 - CI Build 失败并显示上述错误消息。

azure-devops azure-pipelines-build-task azure-pipelines azure-pipelines-release-pipeline packagereference

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

在JSON.NET中反序列化IList &lt;Interface&gt;

我有一些要反序列化的json。将序列反序列化很容易,但是我正在使用接口,这就是我需要反序列化的结果:

因此,让我们从一些JSON开始:

[{"TimeGenerated":"2017-05-30T19:21:06.5331472+10:00","OuterValue":1.08,"Identifier":{"IdentifierName":"BLA","IdentifierNumber":1},"Locale":{"LocaleName":"LOCALE NAME","LocaleType":1,"LocaleNumber":1,"StartTime":"2017-05-30T19:20:00+10:00"},"InnerValue":1.08,"InnerType":0,"InnerId":"InnerI","Type":"MyType","Id":"11111"}]
Run Code Online (Sandbox Code Playgroud)

这是在服务器端进行序列化的数据(当然没有问题),其对象类型为:

IList<IRootObject>
Run Code Online (Sandbox Code Playgroud)

如此有效,我想反序列化为:

IList<IRootObject> MyDeserialisedObject = JsonConvert.Deserialise<IList<IRootObject>>(JsonString);
Run Code Online (Sandbox Code Playgroud)

显然,这里的泡菜是以下的旧界面/抽象类型错误:

'Could not create an instance of type BLA. Type is an interface or abstract class and cannot be instantiated'
Run Code Online (Sandbox Code Playgroud)

很好,我创建了一些自定义转换器,并进行了如下装饰:

类是:

    [JsonObject(MemberSerialization.OptIn)]
    public class Identifier
    {
        [JsonProperty]
        public string IdentifierName { get; set; }
        [JsonProperty]
        public int IdentifierNumber { get; set; }
    }
    [JsonObject(MemberSerialization.OptIn)]
    public class Locale
    {
        [JsonProperty]
        public string LocaleName { get; set; }
        [JsonProperty]            
        public int LocaleType { get; set; }
        [JsonProperty]            
        public int LocaleNumber …
Run Code Online (Sandbox Code Playgroud)

c# json json.net deserialization

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