0

我目前正在重构一个已有几年的现有应用程序,以便我们可以使用依赖注入(我是新手)来注入我想要使用的同步提供程序。

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

我会尽我所能把这个布置好。我有一个Sync类,可通过应用程序的多个部分访问,该应用程序有 4 个都使用的构造函数。

同步文件

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);
}

SyncProvider.cs

public class SyncProvider : ISync
{
    public override object Get()
    {
         //some code
    }

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

Sync类中,我注入的每个 Sync 提供程序的GetSet方法都不同。Sync 类的其余部分需要保持不变。

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

目前,在整个项目中通过以下方式引用 Sync 类:

示例 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。

4

1 回答 1

1

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

工厂本身可以注入到当前构造 Sync 实例的类中,但不是直接“新建”同步对象,而是将其委托给 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();
}
于 2012-11-15T11:59:12.227 回答