我正在尝试创建类似2层架构的东西,其中服务层实例始终需要由服务层中的工厂创建。我希望该服务工厂是通用的并返回一个接口。我做过类似的事情:
// service base interface
namespace SimpleFW.Services
{
public interface IServiceBase
{
void Get();
void Create();
void Update();
void Delete();
}
}
创建以下代码以添加每项服务的自定义功能:
// interface for the custom implementation
namespace SimpleFW.Services
{
public interface ISimpleService : IServiceBase
{
void CustomMethod();
}
}
这是服务的实施方式
// implementation of the service
namespace SimpleFW.Services
{
public class SimpleService : ISimpleService
{
public void CustomMethod()
{
Debug.Write("CustomMethod Method Called.");
}
public void Get()
{
Debug.Write("Get Method Called.");
}
public void Create()
{
Debug.Write("Create Method Called.");
}
public void Update()
{
Debug.Write("Update Method Called.");
}
public void Delete()
{
Debug.Write("Delete Method Called.");
}
}
}
这是一个通用工厂,它将创建服务实例:
// service factory
namespace SimpleFW.Services
{
public class ServiceFactory
{
public static IServiceBase GetService<T>() where T : IServiceBase, new()
{
return new T();
}
}
}
这是单独程序集中的服务客户端
// service client in separate assembly
namespace SimpleFW.Client
{
class Program
{
static void Main(string[] args)
{
IServiceBase service = ServiceFactory.GetService<SimpleService>();
service.Get(); // should be callable from within the same assembly not from client assembly
service.Create(); // should be callable from within the same assembly not from client assembly
service.Update(); // should be callable from within the same assembly not from client assembly
service.Delete(); // should be callable from within the same assembly not from client assembly
((ISimpleService)service).CustomMethod(); // this is fine. I should be able to cast and call the methods like this
SimpleService serObject = new SimpleService(); // how to make this impossible
}
}
}
虽然我在代码旁边写了评论,无论我有什么问题,但问题仍然存在:
某种解决方案(或许):以下是我要做的事情:
SimpleService将始终显式实现接口,如下所示:
// implementation of the service
namespace SimpleFW.Services
{
public class SimpleService : ISimpleService
{
public void ISimpleService.CustomMethod()
{
Debug.Write("CustomMethod Method Called.");
}
public void IServiceBase.Get()
{
Debug.Write("Get Method Called.");
}
public void IServiceBase.Create()
{
Debug.Write("Create Method Called.");
}
public void IServiceBase.Update()
{
Debug.Write("Update Method Called.");
}
public void IServiceBase.Delete()
{
Debug.Write("Delete Method Called.");
}
}
}
通过make,上面的更改不会阻止服务层的使用者创建SimpleService的实例,但是他们将无法直接调用任何已实现的方法。他们只能访问该服务的自定义公共方法。
答案 0 :(得分:1)
如何隐藏IServiceBase接口的实现 外部装配?
使用内部访问modifier。
如何将SimpleService类的构造限制为 工厂只有外部装配总是需要调用 来自通用服务类型工厂的GetService方法?
内部访问修饰符将解决您对SimpleService的问题。
对于您的工厂,我建议您使用Enum来创建您的服务。
public enum ServiceType
{
SimpleService,
.
.
}
// For naming convention use CreateService
IServiceBase service = ServiceFactory.GetService(ServiceType.SimpleService);
public class ServiceFactory
{
public static T GetService(enum type)
{
// create you service here
}
}
答案 1 :(得分:1)
assembly SimpleFW.Services.Core -> IServiceBase interface
assembly SimpleFW.Services.Implementation -> SimpleService class
请注意,在实际必须编写整个应用程序的程序集中,必须使用服务实现引用程序集。因此,该组件中将显示该服务的实现。但是其他程序集只能使用Services.Core
程序集并使用编程到接口。