はい、それは正しいアプローチのようです。いいえ、特に実装を制御している場合は、アプリケーションとデバイスライブラリがインターフェイスに依存することは悪いことではありません。
何らかの理由でデバイスがインターフェースを常に実装するとは限らないことが懸念される場合は、アダプターパターンを利用して、デバイスの具体的な実装をインターフェースに適合させることができます。
編集
5番目の懸念事項に対処するには、次のような構造を考えてください(私はあなたがデバイスの定義を制御していると想定しています)。
コアライブラリがあります。その中には、IDeviceと呼ばれるインターフェースがあります。
デバイスライブラリには、コアライブラリへの参照があり、すべてIDeviceを実装する一連のデバイスを定義しています。さまざまな種類のIDeviceを作成する方法を知っているファクトリもあります。
アプリケーションには、コアライブラリとデバイスライブラリへの参照を含めます。これで、アプリケーションはファクトリを使用して、IDeviceインターフェイスに準拠するオブジェクトのインスタンスを作成します。
これは、懸念に対処するための多くの可能な方法の1つです。
例:
namespace Core
{
public interface IDevice { }
}
namespace Devices
{
using Core;
class DeviceOne : IDevice { }
class DeviceTwo : IDevice { }
public class Factory
{
public IDevice CreateDeviceOne()
{
return new DeviceOne();
}
public IDevice CreateDeviceTwo()
{
return new DeviceTwo();
}
}
}
// do not implement IDevice
namespace ThirdrdPartyDevices
{
public class ThirdPartyDeviceOne { }
public class ThirdPartyDeviceTwo { }
}
namespace DeviceAdapters
{
using Core;
using ThirdPartyDevices;
class ThirdPartyDeviceAdapterOne : IDevice
{
private ThirdPartyDeviceOne _deviceOne;
// use the third party device to adapt to the interface
}
class ThirdPartyDeviceAdapterTwo : IDevice
{
private ThirdPartyDeviceTwo _deviceTwo;
// use the third party device to adapt to the interface
}
public class AdapterFactory
{
public IDevice CreateThirdPartyDeviceAdapterOne()
{
return new ThirdPartyDeviceAdapterOne();
}
public IDevice CreateThirdPartyDeviceAdapterTwo()
{
return new ThirdPartyDeviceAdapterTwo();
}
}
}
namespace Application
{
using Core;
using Devices;
using DeviceAdapters;
class App
{
void RunInHouse()
{
var factory = new Factory();
var devices = new List<IDevice>() { factory.CreateDeviceOne(), factory.CreateDeviceTwo() };
foreach (var device in devices)
{
// call IDevice methods.
}
}
void RunThirdParty()
{
var factory = new AdapterFactory();
var devices = new List<IDevice>() { factory.CreateThirdPartyDeviceAdapterOne(), factory.CreateThirdPartyDeviceAdapterTwo() };
foreach (var device in devices)
{
// call IDevice methods.
}
}
}
}