Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/lua/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当我想简单地新建一个元素或使用XAML创建它时,它们是克服DI限制的方法吗?_C#_.net_Xamarin_Xamarin.forms_Dependency Injection - Fatal编程技术网

C# 当我想简单地新建一个元素或使用XAML创建它时,它们是克服DI限制的方法吗?

C# 当我想简单地新建一个元素或使用XAML创建它时,它们是克服DI限制的方法吗?,c#,.net,xamarin,xamarin.forms,dependency-injection,C#,.net,Xamarin,Xamarin.forms,Dependency Injection,我正在使用: Microsoft.Extensions.DependencyInjectionVersion5.0.1NuGet软件包,我正在创建一个名为ArrowGrid的类,该类创建一些图形元素 我想用C#和可能的XAML调用这样的类: var arrowGrid = new ArrowGrid(); <ArrowGrid /> 现在我遇到了一个问题,因为new ArrowGrid()会给我一个错误,说没有无参数的默认构造函数,所以我想到了这样做: public class

我正在使用:

Microsoft.Extensions.DependencyInjection
Version5.0.1NuGet软件包,我正在创建一个名为
ArrowGrid
的类,该类创建一些图形元素

我想用C#和可能的XAML调用这样的类:

var arrowGrid = new ArrowGrid();

<ArrowGrid />
现在我遇到了一个问题,因为
new ArrowGrid()
会给我一个错误,说没有无参数的默认构造函数,所以我想到了这样做:

public class ArrowGrid : BaseGrid
{
    private readonly IGraphicsService _graphicsService;
    public ArrowGrid()
    {
        _graphicsService = Startup.ServiceProvider.GetRequiredService<GraphicsService>();
        var fr         = _graphicsService.GetFrameWithArrow();
        Children.Add(fr, 3, 0);
    }
}
我认为有以下建议:

var abc = Startup.ServiceProvider.GetRequiredService<ArrowGrid>();
abc.Text1 = "Talk to us";
abc.TapCommandParam = "Home/FBPage";
abc.IconSource = Const.IconSource.CardOptions;
var abc=Startup.ServiceProvider.GetRequiredService();
abc.Text1=“与我们交谈”;
abc.tapcomandparam=“主页/FBPage”;
abc.IconSource=Const.IconSource.cardpoptions;

Startup.ServiceProvider.GetRequiredService()对我来说很好,但有更好的方法。DI容器允许您懒惰,不必自己使用
new
,也不必强制使用DI容器创建任何内容

考虑这个例子。希望您编写代码的类在
servicecolection
中注册

公共类MyTestClass
{
公共MyTestClass()
{
var abc=Startup.ServiceProvider.GetRequiredService();
abc.Text1=“与我们交谈”;
abc.tapcomandparam=“主页/FBPage”;
abc.IconSource=Const.IconSource.cardpoptions;
}
}
可以很容易地用相同的DI版本替换

公共类MyTestClass
{
公共MyTestClass(箭头网格abc)
{
abc.Text1=“与我们交谈”;
abc.tapcomandparam=“主页/FBPage”;
abc.IconSource=Const.IconSource.cardpoptions;
}
}

这就是注册类的应用程序根目录的组合意义。

请让DI Container为您解析实例,而不是执行
new
。谢谢您的建议。根据你的建议,我在问题上加了几句话。你能证实你认为我应该这样做吗。我想对我来说唯一的问题是,如果我这样做,那么我就不能再使用XAML来实例化该对象,因为该对象必须使用DI创建。直接使用
ServiceProvider
是一种反模式。现在,您还将
MyTestClass
Startup
紧密耦合。这两者都违背了DI的目的。如果需要依赖项,请从外部请求并传入。否则,请重新考虑您的设计谢谢您出色的回答。我还有一个小问题,如果我的一个文件中需要两个箭头网格,该怎么办。例如,var arrowGrid1=new ArrowGrid();var arrowGrid2=新的ArrowGrid();你对我如何做到这一点有什么建议吗?@RichardA
publicmytestclass(ArrowGrid abc,ArrowGrid def)
?:)@aepot抱歉,我想对OP发表评论
var abc = new ArrowGrid
{
   Text1               = "Talk to us",
   TapCommandParam     = "Home/FBPage",
   IconSource          = Const.IconSource.CardOptions,
};
var abc = Startup.ServiceProvider.GetRequiredService<ArrowGrid>();
abc.Text1 = "Talk to us";
abc.TapCommandParam = "Home/FBPage";
abc.IconSource = Const.IconSource.CardOptions;