I have the following interfaces and classes:
public interface ILoggingService { ... }
public class LoggingService {
public LoggingService(ILoggingRepository loggingRepository) { ... }
...
}
public interface ILoggingRepository { ... }
public class DatabaseLoggingRepository {
public DatabaseLoggingRepository(string ConnectionString) { ... }
...
}
public class FileLoggingRepository {
public FileLoggingRepository(string LogFilePath) { ... }
...
}
I’m refactoring my software to use Unity IoC framework and am looking for a way to pass the specific configuration to each ILoggingRepository implementation.
I think that the best way would be to change DatabaseLoggingRepository’s and FileLoggingRepository’s constructors to have no parameters at all and have them configured by some configuration file. However, because of my acceptance tests I would need a easy way to override these settings while running my tests.
Am I on the right track and if I am, which configuration files should I use? Alternative ways are welcome as well.
What we’ve decided to do is create a class, in your case it would be
LoggingConfiguration, and have that passed to the constructo of the repository. If you resolve using Unity it will instantiate this class usingActivator, wuthout having to register it. In your tests however, you just greate a new instance of a derived configuration class, providing different values.Does it makes sense? Should I clarify more?
Update: I’ve decided to provide some additional clarification. So, you already have two implementations, and now you want each configuration to query for its proper configuration setting.
I would extend the
ILoggingRepository‘s constructor to look like this:You can then create one implementation for your normal operation which has two properties:
When you instantiate your class via normal IoC operation this will get resolved by the container and you’ll configuration options will get loaded from the conf file. When you however want to do Unit tests you:
1) Create a new “Mock” implementation
Now you can either create the repository using a constructor:
or if you want the whole IoC mechanism to be used, you simply (when setting up the container) register this implementation of the interface. Because the unit tests are separate, you don’t share the registrations right? So that should give you what you need, the ability to change this settings depending on weather they are being executed as a unit test or not.
In real life, I wouldn’t even bother with this, and just create a mock logging repository and have it write somewhere else. Unless you want to test the repository to a test database/file. In which case I’d do as specified.
Hope it helps.