Внедрение зависимости является практикой, где объекты разработаны способом, где они получают экземпляры объектов от других частей кода, вместо того, чтобы создать их внутренне. Это означает, что в любом объекте, реализовывая интерфейс, который требуется объектом, можно заменить, не изменяя код, который упрощает тестирование и улучшает отделение.
, Например, рассмотрите эти классы:
public class PersonService {
public void addManager( Person employee, Person newManager ) { ... }
public void removeManager( Person employee, Person oldManager ) { ... }
public Group getGroupByManager( Person manager ) { ... }
}
public class GroupMembershipService() {
public void addPersonToGroup( Person person, Group group ) { ... }
public void removePersonFromGroup( Person person, Group group ) { ... }
}
В этом примере, для реализации PersonService::addManager
и PersonService::removeManager
был бы нужен экземпляр GroupMembershipService
, чтобы сделать его работу. Без Внедрения зависимости традиционный способ сделать это состоял бы в том, чтобы инстанцировать нового GroupMembershipService
в конструкторе PersonService
лет и использовать тот атрибут экземпляра в обеих функциях. Однако, если у конструктора GroupMembershipService
лет есть несколько вещей, это требует, или хуже все же, существует некоторая инициализация "методы set", которые нужно назвать на эти GroupMembershipService
, код растет скорее быстро, и PersonService
теперь зависит не только от GroupMembershipService
, но также и все остальное, что GroupMembershipService
зависит от. Кроме того, связь с [1 111] является hardcoded в PersonService
, что означает, что Вы не можете "макет" GroupMembershipService
для тестирования, или использовать стратегическую модель в различных частях Вашего приложения.
С Внедрением зависимости, вместо того, чтобы инстанцировать GroupMembershipService
в Вашем PersonService
, Вы или передали бы его в PersonService
конструктор или иначе добавили бы Свойство (метод считывания и метод set) для установки локального экземпляра его. Это означает, что Ваш PersonService
больше не должен волноваться о том, как создать GroupMembershipService
, это просто принимает тех, это дано и работает с ними. Это также означает, что что-либо, что является подклассом [1 119], или реализует эти GroupMembershipService
, интерфейс может быть "введен" в эти PersonService
, и эти PersonService
не должен знать об изменении.
If you want to create the file names youself, put the characters that you want to use in a string and pick from that:
// selected characters
string chars = "2346789ABCDEFGHJKLMNPQRTUVWXYZabcdefghjkmnpqrtuvwxyz";
// create random generator
Random rnd = new Random();
string name;
do {
// create name
name = string.Empty;
while (name.Length < 5) {
name += chars.Substring(rnd.Next(chars.Length), 1);
}
// add extension
name += ".txt";
// check against files in the folder
} while (File.Exists(Path.Compbine(folderPath, name)))
Посмотрите на методы GetTempFileName и GetRandomFileName класса System.IO.Path .
GetRandomFileName создает "криптографически стойкое" имя файла и является тот, который ближе к тому, что вы просили.
GetTempFileName создает уникальное имя файла в каталоге, а также создает файл с нулевым байтом с этим именем, помогая обеспечить его уникальность. Это может быть ближе к тому, что вам действительно может понадобиться.
А как насчет методов Path.GetTempFileName () или Path.GetRandomFileName ()? Учтите также тот факт, что файловая система не является транзакционной и два параллельных процесса могут создавать файлы с одинаковыми именами. TempFileName () должен возвращать уникальное имя (по спецификации), поэтому «возможно» вам не нужно беспокоиться об этом, если временный каталог подходит для вашего решения.
Или вы можете использовать GUID для создания уникального имени файла:
Википедия:
Хотя каждый сгенерированный GUID не гарантированно уникальна, общая количество уникальных ключей (2 ^ 128 или 3,4 × 10 ^ 38) настолько велико, что вероятность того, что то же число generated twice is infinitesimally small.
string text = "Sample...";
string path = "D:\\Temp\\";
if (!path.EndsWith("\\"))
path += "\\";
string filename = path + Guid.NewGuid().ToString() + ".txt";
while (File.Exists(filename))
filename = path + Guid.NewGuid().ToString() + ".txt";
TextWriter writer = null;
try
{
writer = new StreamWriter(filename);
writer.WriteLine(text);
writer.Close();
}
catch (Exception e)
{
MessageBox.Show("Exception occured: " + e.ToString());
}
finally
{
if (writer != null)
writer.Close();
}
Часть кода, которая генерирует случайную строку (букв), была размещена здесь . Код, создающий файлы (также использующий случайные имена файлов), доступен здесь .
нашел это в Google для вас ( источник здесь ):
/// <summary>
/// Generates a random string with the given length
/// </summary>
/// <param name="size">Size of the string</param>
/// <param name="lowerCase">If true, generate lowercase string</param>
/// <returns>Random string</returns>
private string RandomString(int size, bool lowerCase)
{
StringBuilder builder = new StringBuilder();
Random random = new Random();
char ch ;
for(int i=0; i<size; i++)
{
ch = Convert.ToChar(Convert.ToInt32(Math.Floor(26 * random.NextDouble() + 65))) ;
builder.Append(ch);
}
if(lowerCase)
return builder.ToString().ToLower();
return builder.ToString();
}
После этого используйте файловые потоки для создания и записи файла.