.net 接口上特定于实现的方法-如何避免它们? 我们有一个使用IoC容器传递给构造函数的接口 我们有多个类实现这个接口

.net 接口上特定于实现的方法-如何避免它们? 我们有一个使用IoC容器传递给构造函数的接口 我们有多个类实现这个接口,.net,interface,idisposable,.net,Interface,Idisposable,问题是,一些(不是全部)实现需要清理,最好使用IDisposable接口 因为不是所有的实现都需要“Dispose”方法,所以我是否也包括它(我意识到我实际上并没有实现IDisposable,这只是一个示例)?在我看来,了解接口的实际实现的类应该知道如何清理这些对象。然而,这是IoC容器,我看不到有任何优雅的方式来通知它对它创建的特定类调用cleanup interface IBar { void DoWork(); void Dispose(); //Not all implement

问题是,一些(不是全部)实现需要清理,最好使用IDisposable接口

因为不是所有的实现都需要“Dispose”方法,所以我是否也包括它(我意识到我实际上并没有实现IDisposable,这只是一个示例)?在我看来,了解接口的实际实现的类应该知道如何清理这些对象。然而,这是IoC容器,我看不到有任何优雅的方式来通知它对它创建的特定类调用cleanup

interface IBar
{
  void DoWork();
  void Dispose(); //Not all implementations need this
}

class Foo : IBar
{
  public void DoWork()
  {
    //implementation 1
  }

  public void Dispose()
  {
    //cleanup, which needs to be called
  }
}

class Foo2 : IBar
{
  public void DoWork()
  {
    //implementation 2
  }

  public void Dispose()
  {
    //No cleanup needed in this implementation
  }
}

什么时候需要调用Dispose?在执行工作之后还是在应用程序关闭期间?如果是后者,你的IoC容器不支持这样的清理吗?在Java和Spring IoC容器中,您的实现将实现Spring的一次性接口,并且容器将在关闭期间调用dispose方法。

何时需要调用dispose?在执行工作之后还是在应用程序关闭期间?如果是后者,你的IoC容器不支持这样的清理吗?在Java和Spring IoC容器中,您的实现将实现Spring的一次性接口,并且容器将在关闭期间调用dispose方法。

以下内容有什么问题

interface IBar { void DoWork(); }
class Foo : IBar, IDisposable { // details, implements Dispose }
class Foo2 : IBar { // details, no Dispose }

下面的问题是什么

interface IBar { void DoWork(); }
class Foo : IBar, IDisposable { // details, implements Dispose }
class Foo2 : IBar { // details, no Dispose }

您可以在需要的设备上实现IDisposable,然后执行以下操作:

interface IBar
{
    void Bar();
}

class Foo : IBar
{
    public void Bar() { }
}

class Foo2 : IBar, IDisposable
{
    public void Bar() {}
    public void Dispose() {}
}

class Program
{
    static void Main(string[] args)
    {
        foreach (IBar bar in new IBar[] { new Foo(), new Foo2() })
        {
            bar.Bar();

            IDisposable disp = bar as IDisposable;

            if (disp != null)
            {
                disp.Dispose();
            }
        }
    }
}

您可以在需要的设备上实现IDisposable,然后执行以下操作:

interface IBar
{
    void Bar();
}

class Foo : IBar
{
    public void Bar() { }
}

class Foo2 : IBar, IDisposable
{
    public void Bar() {}
    public void Dispose() {}
}

class Program
{
    static void Main(string[] args)
    {
        foreach (IBar bar in new IBar[] { new Foo(), new Foo2() })
        {
            bar.Bar();

            IDisposable disp = bar as IDisposable;

            if (disp != null)
            {
                disp.Dispose();
            }
        }
    }
}

奇怪的问题。如果您特别关注的是
IDisposable
,大多数容器将检查实现,如果它包含
IDisposable
的实现,则容器将在释放实例时自动调用
Dispose()

所以

您的消费者不应该了解注入组件的生命周期,也不应该以任何形式对其负责。从这个角度看,<>代码> ISOMeMeuthOffice接口< /C>不继承或暴露任何此类代码>处置< /代码>方法-我的意思是,考虑如果您处理了一个重要的单独服务!那会有多尴尬

那么,谁负责注射组件的生命周期?好吧,容器当然是!如前所述,大多数容器将检查组件实现是否实现了
IDisposable
[这也是使用标准CLR定义接口的另一个原因],并在确定组件已达到其使用寿命时调用
Dispose
。因此,
SomeDisposableBusinessImplementation
最终将被正确处理。:)


温莎城堡

Castle Windsor IoC容器跟踪并维护对其创建的所有实例的引用。它使用反射来确定实例是否是“一次性的”,然后在实例的生命周期结束时调用
Dispose()
。对于长寿命对象,这是容器被释放的时候。对于短暂的对象,这是当消费者*显式调用
Release(object)

*=这引出了一个重要的问题,瞬态对象应该通过显式调用
Resolve()
获取,并通过显式调用
Release(object)
释放。隐式注入瞬态类可能导致内存泄漏


结构图

这几乎意味着对象生命周期管理有点复杂+。这对于短暂存在的对象非常有用,因为不需要额外的簿记。但是,对于长寿命的对象,您必须这样做


+=复杂的问题。

奇怪的问题。如果您特别关注的是
IDisposable
,大多数容器将检查实现,如果它包含
IDisposable
的实现,则容器将在释放实例时自动调用
Dispose()

所以

您的消费者不应该了解注入组件的生命周期,也不应该以任何形式对其负责。从这个角度看,<>代码> ISOMeMeuthOffice接口< /C>不继承或暴露任何此类代码>处置< /代码>方法-我的意思是,考虑如果您处理了一个重要的单独服务!那会有多尴尬

那么,谁负责注射组件的生命周期?好吧,容器当然是!如前所述,大多数容器将检查组件实现是否实现了
IDisposable
[这也是使用标准CLR定义接口的另一个原因],并在确定组件已达到其使用寿命时调用
Dispose
。因此,
SomeDisposableBusinessImplementation
最终将被正确处理。:)


温莎城堡

Castle Windsor IoC容器跟踪并维护对其创建的所有实例的引用。它使用反射来确定实例是否是“一次性的”,然后在实例的生命周期结束时调用
Dispose()
。对于长寿命对象,这是容器被释放的时候。对于短暂的对象,这是当消费者*显式调用
Release(object)

*=这引出了一个重要的问题,瞬态对象应该通过显式调用
Resolve()
获取,并通过显式调用
Release(object)
释放。隐式注入瞬态类可能导致内存泄漏


结构图

这几乎意味着对象生命周期管理有点复杂+。这对tra来说很好