You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

DryIoc注册带参数的接口/类构造函数问题求助

解决DryIoc中已有实例的依赖注册问题

嘿,我懂你这种卡在简单问题上的烦躁——明明翻了官网和Stack Overflow的例子,但就是没对上自己的场景对吧?结合你给出的代码片段,我猜你是想把已经手动创建好的mySample1mySample2作为依赖注入到其他服务里,但不知道怎么在DryIoc里正确注册?别着急,我给你两种最常用的解决方案:

方案一:将已有实例注册到容器全局

如果你希望整个容器都能使用这些预创建的实例,直接用Instance方法(DryIoc v3+版本)或者RegisterInstance(旧版本)注册它们,之后容器会自动把这些实例注入到依赖它们的服务中:

class Program 
{
    static void Main(string[] args) 
    {
        var mySample1 = new SampleOne {TestProperty = "Test1"};
        var mySample2 = new SampleTwo {TestProperty2 = "Test2"};

        using (var container = new Container()) 
        {
            // 注册预创建的实例到容器
            container.Instance(mySample1);
            container.Instance(mySample2);

            // 注册依赖这两个实例的服务(假设你的ICustomService实现需要它们作为构造参数)
            container.Register<ICustomService, CustomServiceImpl>();

            // 解析服务,DryIoc会自动注入mySample1和mySample2
            var service = container.Resolve<ICustomService>();
            service.PrintValues(); // 验证注入结果
        }
    }
}

// 补充你可能的类定义
public interface ICustomService { void PrintValues(); }
public class CustomServiceImpl : ICustomService 
{
    private readonly SampleOne _sample1;
    private readonly SampleTwo _sample2;

    // 通过构造函数声明依赖
    public CustomServiceImpl(SampleOne sample1, SampleTwo sample2) 
    {
        _sample1 = sample1;
        _sample2 = sample2;
    }

    public void PrintValues() 
    {
        Console.WriteLine($"Sample1的值:{_sample1.TestProperty}");
        Console.WriteLine($"Sample2的值:{_sample2.TestProperty2}");
    }
}

public class SampleOne { public string TestProperty { get; set; } }
public class SampleTwo { public string TestProperty2 { get; set; } }

方案二:仅给特定服务传入实例(不全局注册)

如果你不想把SampleOneSampleTwo注册到容器全局,只是想让某个特定服务使用这些预创建的实例,可以用Made.Of指定构造参数:

using (var container = new Container()) 
{
    // 直接注册服务时指定构造参数为预创建的实例
    container.Register<ICustomService>(
        made: Made.Of(() => new CustomServiceImpl(mySample1, mySample2))
    );

    var service = container.Resolve<ICustomService>();
    service.PrintValues();
}

关键注意点

  • 确保你的服务类(比如CustomServiceImpl)的构造函数明确声明了依赖的类型,DryIoc才能自动匹配注入。
  • 如果你的实例是单例需求,Instance方法默认就是单例生命周期,不需要额外配置;如果需要其他生命周期,可以加参数(比如Reuse.Scoped)。

内容的提问来源于stack exchange,提问作者developer9969

火山引擎 最新活动