Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/307.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# 依赖注入项目重因子_C#_Asp.net_Dependency Injection_Ninject - Fatal编程技术网

C# 依赖注入项目重因子

C# 依赖注入项目重因子,c#,asp.net,dependency-injection,ninject,C#,Asp.net,Dependency Injection,Ninject,我目前正在重新分解一个已有几年历史的现有应用程序,这样我们就可以使用依赖注入(我是新手)来注入我想要使用的同步提供程序 我正在努力解决如何设置接口和工厂的问题,因为我正在处理的类有多个构造函数 我会尽可能地把这件事说清楚。我有一个Sync类,可以通过应用程序的多个部分访问该类,该应用程序有4个构造函数,它们都被使用 Sync.cs public class Sync : ISync { private static Hashtable _locks = new Hashtable();

我目前正在重新分解一个已有几年历史的现有应用程序,这样我们就可以使用依赖注入(我是新手)来注入我想要使用的同步提供程序

我正在努力解决如何设置接口和工厂的问题,因为我正在处理的类有多个构造函数

我会尽可能地把这件事说清楚。我有一个Sync类,可以通过应用程序的多个部分访问该类,该应用程序有4个构造函数,它们都被使用

Sync.cs

public class Sync : ISync
{
    private static Hashtable _locks = new Hashtable();

    private CSettings _cs = null;
    private RemovedCallback _callback = null;
    protected object _cObject = null;
    protected bool _isLocked = false;
    private DateTime _expires = DateTime.MinValue;

    public Sync() { }

    public Sync(CSettings cs) : this(cs, null) { }

    public Sync(CSettings cs, RemovedCallback callback)
    {
        Callback = callback;
        Settings = cs;
    }

    public Sync(string key)
    {
        Settings = new CSettings();

        Settings.Key = key;
    }

    public object Object
    {
        get { return Get(); }
        set { Set(value); }
    }

    public void Get()
    { 
    }

    public void Set()
    {
    }

    //other methods, some that reference Remove and Set
}
public interface ICacheSync : IDisposable
{
    object Get();

    void Set(object obj);
}
public class SyncProvider : ISync
{
    public override object Get()
    {
         //some code
    }

    public override void Set(object obj)
    {
        //some code
    }
}
ISync.cs

public class Sync : ISync
{
    private static Hashtable _locks = new Hashtable();

    private CSettings _cs = null;
    private RemovedCallback _callback = null;
    protected object _cObject = null;
    protected bool _isLocked = false;
    private DateTime _expires = DateTime.MinValue;

    public Sync() { }

    public Sync(CSettings cs) : this(cs, null) { }

    public Sync(CSettings cs, RemovedCallback callback)
    {
        Callback = callback;
        Settings = cs;
    }

    public Sync(string key)
    {
        Settings = new CSettings();

        Settings.Key = key;
    }

    public object Object
    {
        get { return Get(); }
        set { Set(value); }
    }

    public void Get()
    { 
    }

    public void Set()
    {
    }

    //other methods, some that reference Remove and Set
}
public interface ICacheSync : IDisposable
{
    object Get();

    void Set(object obj);
}
public class SyncProvider : ISync
{
    public override object Get()
    {
         //some code
    }

    public override void Set(object obj)
    {
        //some code
    }
}
SyncProvider.cs

public class Sync : ISync
{
    private static Hashtable _locks = new Hashtable();

    private CSettings _cs = null;
    private RemovedCallback _callback = null;
    protected object _cObject = null;
    protected bool _isLocked = false;
    private DateTime _expires = DateTime.MinValue;

    public Sync() { }

    public Sync(CSettings cs) : this(cs, null) { }

    public Sync(CSettings cs, RemovedCallback callback)
    {
        Callback = callback;
        Settings = cs;
    }

    public Sync(string key)
    {
        Settings = new CSettings();

        Settings.Key = key;
    }

    public object Object
    {
        get { return Get(); }
        set { Set(value); }
    }

    public void Get()
    { 
    }

    public void Set()
    {
    }

    //other methods, some that reference Remove and Set
}
public interface ICacheSync : IDisposable
{
    object Get();

    void Set(object obj);
}
public class SyncProvider : ISync
{
    public override object Get()
    {
         //some code
    }

    public override void Set(object obj)
    {
        //some code
    }
}
Sync类中,对于我注入的每个同步提供程序,GetSet方法将不同。Sync类的其余部分需要保持不变

我的最终目标是能够注入以不同方式使用GetSet的不同同步提供者

当前,在整个项目中,同步类的引用方式如下:

示例1

using (Sync sync = new Sync(CSettings, ItemRemoved))
{
    //some code
}
示例2

using (Sync sync = new Sync(CSettings))
{
     sync.Remove();
}
示例3

using (Sync sync = new Sync(string))
{
    sync.Remove();
}
我正在使用Ninject,并尝试了创建接口和注入的方法,但它似乎不起作用,因为我总是以对象引用未设置为对象错误实例而告终


关于如何进行这项工作的任何帮助或指导都将极大地帮助我更好地理解DI。

在这种情况下,我建议您使用工厂,而不是依赖注入

工厂本身可以注入到当前构造同步实例的类中,但您不需要直接“新建”同步对象,而是将其委托给SyncFactory:

using (Sync sync = this.syncFactory.Create(CSettings, ItemRemoved))
{
    //some code
}

using (Sync sync = this.syncFactory.Create(CSettings))
{
    //some code
}

using (Sync sync = this.syncFactory.Create(stringValue)
{
    sync.Remove();
}

谢谢你,让我早一点给你。请记住,这在您的情况下是毫无意义的:Sync是一个没有接口的具体实现,所以根本不需要考虑这一点。它可能对测试有用(您可以创建一个返回MockSync实例的MockSyncFactory,或者使用类似TypeMock的东西来完成繁重的工作)。但是,老实说,您可以让代码保持原样,因为在其周围添加更多的工程设计并没有太大的作用。我需要在其后面添加一个接口,以便我还可以向其同步提供程序注入同步。例如,在Sync接口中,我会让方法Get、Set。然后在SyncProvider中,我将拥有执行Get&Set的功能(希望这是有意义的)。我将编辑以上内容以反映它。