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