Interface for 4 interfaces?
I'm having a quite large database app and trying to be using the repository pattern.
I have 4 interfaces: IProductRepository, IFileRepository .... , and I want to have an combin开发者_运维知识库ed interface for all 4 which I want to act like an API to other parts of the application.
Must I have a class and type in all the methods of the 4 interfaces, and add interface to that class? Sounds like lots of work. Since each of the 4 have lots of methods I wouldn't like to type them all once again.
Or how do I solve this in the most clean and nice way?
From your description, it sounds like a Facade should fit the bill.
http://www.dofactory.com/Patterns/PatternFacade.aspx
Yes. This is possible downside to using interfaces. Only good way to make this bearable is to use some kind of code generation tool. Something like T4.
Yes, there's no other way, as far as I know. But tools like Resharper make it all a lot easier.
What about implementing a generic IRepository that each of the classes can use?
One other option is to use a tool like Dynamic Proxy and mixin your repository implementations. This would relieve you of the work having to create the manual forwarding implementation.
Example:
public class Product
{
}
public interface IProductRepository
{
void Save(Product p);
}
public class ProductRepository : IProductRepository
{
public void Save(Product p)
{
Console.WriteLine("Saved Product");
}
}
public class File
{
}
public interface IFileRepository
{
void Save(File f);
}
public class FileRepository : IFileRepository
{
public void Save(File f)
{
Console.WriteLine("Saved File");
}
}
public class Repository
{
}
Create the mixin:
var options = new ProxyGenerationOptions();
options.AddMixinInstance(new ProductRepository());
options.AddMixinInstance(new FileRepository());
var generator = new ProxyGenerator();
var proxy = (Repository)generator.CreateClassProxy(typeof(Repository), options);
(proxy as IProductRepository).Save(new Product());
(proxy as IFileRepository).Save(new File());
Somehow I have the feeling you should also be able to combine your interfaces and proxy on that. Something along those lines:
public interface IFullRepository : IProductRepository, IFileRepository
{
}
var proxy = (IFullRepository)generator.???
I haven't found a way to make it work - maybe ask the Dynamic Proxy guys.
精彩评论